vue---component2---组件传参1 之 父传子props(父组件向子组件传、子组件向父组件传、非相关组件之间传参)

vue的传参方式和router的使用技巧 – 详情链接

组件传参

  1. 父组件向子组件传,通过props属性实现
  2. 子组件向父组件传,通过事件派发
  3. 非相关组件之间传参,使用事件总线

一、父组件向子组件传参使用props属性进行传递

div#app是父组件,组件模板是子组件,通过<对应的组件模板名字 变量></对应的组件模板名字>来链接,俺是这样理解的,不知道对不对
demo1:props是数组的时候,不能解决内部元素身为对象所产生的问题,既报错又导致相应内容不出来
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>组件传参</title>
    <style>
      .counter {
        border-bottom: solid orangered 0.02rem;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <!-- 因为step的值是一个数字 而title的值是一个字符串类型 
      v-bind 是vue中的一个指令(命令,标签属性),动态的绑定一个数据,可以简写为:,
      -->
      <counter :step="2" title="计数器1"></counter>
      <counter :step="5" title="计数器2"></counter>
      <counter
        :step="7"
        title="计数器3"
        :list="['小明', '小花', '小智', '小力', '阿奇']"
        :dog="{id: 1, name: '天天', skills: '开直升飞机'}"
      ></counter>
    </div>
    <script src="./libs/vue.js"></script>
    <script>
      // 父组件向子组件传参使用props属性进行传递
      var counter = {
        template: `<div class="counter">
          <h5>当前的步长为:{{step}}</h5>
          <p>{{title}}</p>
          <button @click="count+=step">当前的计数值为:{{count}}</button>
          <p v-for="(item, index) in list" :key="index">{{item}}</p>
        </div>`,
        data() {
          return {
            count: 1,
          };
        },
        props: ["step", "title", "list"], // 属性以数组的形式获取
        // list是数组的话,可以写在template中,即使counter在#app容器内没有写相关属性值都是没问题的
        // 但如果是对象的话,如果template中有使用到这个对象的相关内容,每个counter都必须写相关属性,否则会报错,还会导致部分内容不出现
      };
      new Vue({
        el: "#app",
        components: {
          counter,
        },
      });
    </script>
  </body>
</html>

demo2:props是对象的时候,给内部对象设置默认值,即可解决内部元素身为对象所产生的问题,不过还是会报错的,只不过是不影响结果
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>组件传参-父传子</title>
    <style>
      .dog {
        border-bottom: solid 0.02rem deeppink;
        padding: 0.2rem;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <dog></dog
      ><!-- m是对象,如果m不传参 就会报错 ,但是不影响结果 -->
      <dog :m="{name:'天天', skills:'驾驶飞机'}"></dog>
      <dog :m="{name:'小力', skills:'开铲车'}"></dog>
      <dog :m="{name:'赤丸', skills:'...'}"></dog>
    </div>
    <script src="./libs/vue.js"></script>
    <script>
      /* 组件套组件 用components */
      const fav = {
        template: `<h1>特殊技能</h1>`,
      };
      const dog = {
        components: {
          fav,
        },
        template: `<div class="dog">
          <h5>{{m.name}}</h5>
          <p>{{m.skills}}</p>
          <h3>{{pet}}</h3>
          <fav></fav>
        </div>`,
        /* 放在这个位置也可以
        components: {
          fav,
        }, */
        props: {
          /* m是个对象 ,此时不传参 ,会报错,但是会使用default的默认值,不影响结果,但是前面一个demo的哪个对象没有默认值才会既报错又影响结果 */
          m: {
            type: Object,
            default: {
              name: "赤丸",
              skills: "。。。",
            },
          },
          /* pet是个字符串 ,不是对象,所以不传参不会报错也不会对结果有什么影响 */
          pet: {
            type: String,
            // default: "小狗",
            // required: true, // 设置属性必填
          },
        },
      };

      new Vue({
        el: "#app",
        components: {
          dog,
        },
      });
    </script>
  </body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值