zoukankan      html  css  js  c++  java
  • vue组件常用传值

    一.使用Props传递数据

     

    在父组件中使用儿子组件

    <template>
     <div>
      父组件:{{mny}}
      <Son1 :mny="mny"></Son1>
     </div>
    </template>
    <script>
    import Son1 from "./Son1";
    export default {
     components: {
      Son1
     },
     data() {
      return { mny: 100 };
     }
    };
    </script>

    子组件接受父组件的属性

     

    二.使用$emit使用

    子组件触发父组件方法,通过回调的方式将修改的内容传递给父组件

    <template>
     <div>
      父组件:{{mny}}
      <Son1 :mny="mny" @input="change"></Son1>
     </div>
    </template>
    <script>
    import Son1 from "./Son1";
    export default {
     methods: {
      change(mny) {
       this.mny = mny;
      }
     },
     components: {
      Son1
     },
     data() {
      return { mny: 100 };
     }
    };
    </script>

    子组件触发绑定自己身上的方法

    <template>
     <div>
      子组件1: {{mny}}
      <button @click="$emit('input',200)">更改</button>
     </div>
    </template>
    <script>
    export default {
     props: {
      mny: {
       type: Number
      }
     }
    };
    </script>

    这里的主要目的就是同步父子组件的数据,->语法糖的写法

    #.sync
    <Son1 :mny.sync="mny"></Son1>
    <!-- 触发的事件名 update:(绑定.sync属性的名字) -->
    <button @click="$emit('update:mny',200)">更改</button>
    
    #v-model
    <Son1 v-model="mny"></Son1>
    <template>
     <div>
      子组件1: {{value}} // 触发的事件只能是input
      <button @click="$emit('input',200)">更改</button>
     </div>
    </template>
    <script>
    export default {
     props: {
      value: { // 接收到的属性名只能叫value
       type: Number
      }
     }
    };
    </script>

    三.$parent、$children

    继续将属性传递

    <Grandson1 :value="value"></Grandson1>
    <template>
     <div>
      孙子:{{value}}
      <!-- 调用父组件的input事件 -->
      <button @click="$parent.$emit('input',200)">更改</button>
     </div>
    </template>
    <script>
    export default {
     props: {
      value: {
       type: Number
      }
     }
    };
    </script>

    如果层级很深那么就会出现$parent.$parent.....我们可以封装一个$dispatch方法向上进行派发

    #$dispatch
    Vue.prototype.$dispatch = function $dispatch(eventName, data) {
      let parent = this.$parent;
      while (parent) {
        parent.$emit(eventName, data);
        parent = parent.$parent;
      }
    };
    
    
    既然能向上派发那同样可以向下进行派发
    
    #$broadcast
    Vue.prototype.$broadcast = function $broadcast(eventName, data) {
      const broadcast = function () {
        this.$children.forEach((child) => {
          child.$emit(eventName, data);
          if (child.$children) {
            $broadcast.call(child, eventName, data);
          }
        });
      };
      broadcast.call(this, eventName, data);
    };

    四.$attrs、$listeners

    #$attrs

    批量向下传入属性

    <Son2 name="jack" age="10"></Son2>
    
    <!-- 可以在son2组件中使用$attrs属性,可以将属性继续向下传递 -->
    <div>
      儿子2: {{$attrs.name}}
      <Grandson2 v-bind="$attrs"></Grandson2>
    </div>
    
    
    <template>
     <div>孙子:{{$attrs}}</div>
    </template>

    #$listeners

    批量向下传入方法

    <Son2 name="jack" age="10" @click="()=>{this.mny = 500}"></Son2>
    <!-- 可以在son2组件中使用listeners属性,可以将方法继续向下传递 -->
    <Grandson2 v-bind="$attrs" v-on="$listeners"></Grandson2>
    
    <button @click="$listeners.click()">更改</button>
     

    五.Provide & Inject

    #Provide
    在父级中注入数据
    
    provide() {
      return { parentMsg: "父亲" };
    },
    
    #Inject
    在任意子组件中可以注入父级数据
    
    inject: ["parentMsg"] // 会将数据挂载在当前实例上
     

    六.Ref使用

    获取组件实例

    <Grandson2 v-bind="$attrs" v-on="$listeners" ref="grand2"></Grandson2>
    mounted() { // 获取组件定义的属性
      console.log(this.$refs.grand2.name);
    }
     

    七.EventBus

    用于跨组件通知(不复杂的项目可以使用这种方式)
    
    Vue.prototype.$bus = new Vue();
    
    Son2组件和Grandson1相互通信
    
     mounted() {
      this.$bus.$on("my", data => {
       console.log(data);
      });
     },
    
    mounted() {
      this.$nextTick(() => {
       this.$bus.$emit("my", "我是Grandson1");
      });
     },
  • 相关阅读:
    python 高阶函数
    python 列表
    python 模块
    浅谈HashMap原理,记录entrySet中的一些疑问
    extjs Tree中避免连续单击会连续请求服务器
    Java类的加载顺序
    mybatis中集成sharing-jdbc采坑
    tomcat采坑
    AQS原理
    Redis分布式锁原理
  • 原文地址:https://www.cnblogs.com/ll15888/p/11979353.html
Copyright © 2011-2022 走看看