最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Vue组件通信的方式【面试题】

    正文概述 掘金(Pluto。君)   2021-03-23   620

    Vue组件通信的方式【面试题】

    1、Props+$emit

    父子间通信:父亲提供数据通过属性 props传给儿子;儿子通过 $on 绑父亲的事件,再通过 $emit 触发自己的事件(发布订阅)。

    父组件:

        <template>
          <div class="navbar">
            <Child :msg="msg" @changeMsg="msg = $event"></Child>
          </div>
        </template>
    
        <script>
        import Child from "./Child.vue";
    
        export default {
          name: "Father",
          components: { Child },
          data() {
            return {
              msg: "hello son",
            };
          },
        };
        </script>
    

    子组件:

        <template>
          <div class="">
           {{msg}}
           <button @click="changeMsg"></button>
          </div>
        </template>
    
        <script>
    
        export default {
          props: ["msg"],
          name: "Child",
          data() {
            return {
            };
          },
          methods:{
            changeMsg(){
              this.$$emit('changeMsg','hello father')
            }
          }
        };
        </script>
    

    2、回调函数

    回调函数的用法其实和上一种差不多。

    父组件:

        <template>
          <div class="">
           <Child :msg="msg" :changeFn="changeMsg"></Child>
          </div>
        </template>
    
        <script>
        import Child from './Child.vue'
        export default {
          name: "Father",
          components:{Child},
          data() {
            return {
              msg:'hello child'
            };
          },
          methods:{
            changeMsg(){
              this.msg="hello father"
            }
          }
        };
        </script>
    

    子组件:

        <template>
          <div class="">
          {{msg}}
          <button @click="changeFn"></button>
          </div>
        </template>
    
        <script>
        export default {
          name: "Child",
          props:['msg','changeFN'],
          data() {
            return {
            };
          }
        };
        </script>
    

    3、利用父子关系$parent$children

    父组件:

        this.$childfren[0]['子组件的属性或者方法'] // 一个父组件中可能会引入多个子组件,固this.$childfren[0]标识第一个子组件
    

    子组件:

        this.$parent['父组件的属性活方法']
    

    4、使用 provide + inject

    父组件提供数据,子组件注入。 ·provide· 、 ·inject· ,插件用得多。

    在父组件中提供数据(provide):

        <template>
          <div class=""></div>
        </template>
    
        <script>
        export default {
          name: "Father",
          provide: { msg: "hello son" },
          data() {
            return {};
          },
        };
        </script>
    

    在子组件中注入消费:

        <template>
          <div class="">
            {{ msg }}
          </div>
        </template>
    
        <script>
        import Child from './Child.vue'
        export default {
          name: "Child",
          inject: ["msg"],
          data() {
            return {};
          },
        };
        </script>
    

    5、使用 $listeners

    $listeners属性:包含了组件的所有监听器。可直接绑定在组件子元素.

    场景:父亲->儿子->孙子

    父组件:

        <template>
          <div class="">
            <Child :msg="msg"></Child>
          </div>
        </template>
    
        <script>
        import Child from "./Child.vue";
        export default {
          name: "Father",
          components: { Child },
          data() {
            return {
              msg: "",
            };
          },
        };
        </script>
    

    子组件:

        <template>
          <div class="">
            <!-- 直接使用 listeners 访问父组件的属性 -->
            {{$listeners.msg}}
            <GrandChild v-bind="$attrs"></GrandChild>
          </div>
        </template>
    
        <script>
        import GrandChild from "./GrandChild.vue";
        export default {
          name: "Child",
          components: { GrandChild },
          data() {
            return {};
          },
        };
        </script>
    

    孙组件:

        <template>
          <div class="">
            {{ $attrs.msg }}
          </div>
        </template>
        <script>
        export default {
          name: "GrandCHild",
          data() {
            return {};
          },
        };
        </script>
    

    6、ref 获取组件实例,调用组件的属性、方法

    ref 获取组件实例,调用组件的属性、方法

    父组件:

        <template>
          <div class="">
            <Child :ref="childComponent"></Child>
          </div>
        </template>
        <script>
        import Child from "./Child.vue";
        export default {
          name: "Father",
          components: { Child },
          data() {
            return {};
          },
          created() {
            this.$$ref.childComponent.showMeLook();
            this.$ref.childComponent.msgs; // 通过注册的子组件示例访问子组件的方法或者属性
          },
        };
        </script>
    

    子组件:

        <template>
         <div class=""></div>
       </template>
       <script>
       export default {
         name: "Child",
         data() {
           return {
             msgs: "i am son",
           };
         },
         methods: {
           showMeLook() {
            this.msgs = "alert('我是儿')";
           },
         },
       };
       </script>
    

    7、vuex 状态管理实现通信和跨组件通信 Event Bus

    1. vuex 状态管理实现通信
    2. Vue.prototype.bus = new Vue其实基于on与$emit

    起源地下载网 » Vue组件通信的方式【面试题】

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元