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

    正文概述 掘金(HaiJun)   2021-01-24   552

    Vue 组件通信的 8 种方式

    前言

    Vue 组件之间传值

    1. 父组件 向 子组件 传递值

    #父组件
    
    <template>
      <div>
        <!-- 传递值 -->
        <Test
         :obj="obj" 
         info="测试"/>
      </div>
    </template>
    
    <script>
    // 引入子组件
    import Test from "../components/Test.vue";
    export default {
      name: "about",
      // 注册子组件
      components: {
        Test,
      },
      data() {
        return {
          obj: {
            code: 200,
            title: "前端自学社区",
          },
        };
      },
    };
    </script>
    
    
    <template>
        <div>
            <h1>{{obj.code}}</h1><br>
            <h2>{{obj.title}}</h2>
            <h3>{{info}}</h3>
        </div>
    </template>
    
    <script>
        export default {
            name:'test',
            props:{
                obj:Object,
                info: [String,Number]  //info值为其中一种类型即可,其他类型报警告
            }
        }
    </script>
    

    2. 子组件 向父组件传递值

    #父组件
    
    <Test
         :obj="obj" 
         info="测试"
         @modify="modifyFatherValue"/>
    
    <script>
    // 引入子组件
    import Test from "../components/Test.vue";
    export default {
      name: "about",
      // 注册子组件
      components: {
        Test,
      },
      data() {
        return {
          msg:'我是父组件'
        };
      },
      methods:{
        // 接受子组件传递来的值,赋值给data中的属性
        modifyFatherValue(e){
          this.msg = e
        }
      }
    };
    </script>
    
    # 子组件
    
    <button @click="modifyValue">修改父组件的值</button>
    
    
    <script>
        export default {
            name:'test',
            methods:{
                modifyValue(){
                    this.$emit('modify','子组件传递过来的值')
                }
            }
        }
    </script>
    

    3. 父组件 通过 $refs / $children 来获取子组件值

    示例 Text 组件

    <script>
        export default {
            name:'test',
            data() {
                return {
                    datas:"我是子组件值"
                }
            },
            props:{
                obj:Object,
                info: [String,Number]
            },
            methods:{
                getValue(){
                    console.log('我是Test1')
                }
            }
        }
    </script>
    

    示例 Text2组件

    <template>
        <div>
            <h1>我是Test2</h1>
        </div>
    </template>
    
    <script>
        export default {
            name:'test',
            data() {
                return {
                    datas:"我是Test2"
                }
            },
            created(){
             console.log( this.$parent.obj ) 
             this.$parent.getQuery()
            },
            methods:{
                getTest2(){
                    console.log(this.datas)
                }
                
            }
        }
    </script>
    

    refs

    <template>
      <div>
       // 给子组件上绑定 ref  
        <Test
          ref="son"
        />
       <Test2/>
      </div>
    </template>
    
    // 通过 $refs 示例来获取 子组件的属性和方法
    
     console.log( this.$refs.son.datas) 
    
     this.$refs.son.getValue()
    

    $children

    //  通过 $children  来获取 子组件的属性和方法
          this.$children[0].getValue(); // 我是 Test1
          this.$children[1].getTest2();  //我是 Test2
          console.log(`---------${this.$children[1].datas}`); //我是Test2
    

    4. 子组件 通过 $parent 来获取父组件实例的属性和方法

    <script>
        export default {
            name:'test',
            created(){
             console.log( this.$parent.obj ) 
             this.$parent.getQuery()
            },
            
        }
    </script>
    

    5. $attrs $listeners 获取父组件实例属性和方法(组件嵌套情况下使用)

    父组件

    <template>
        <div>
            <Test3  
            :status="status" 
            :
            @getData="getData" />
        </div>
    </template>
    
    <script>
    import Test3 from "../components/Test3.vue";
        export default {
            name:'person',
            data(){
                return {
                    title:'personal 组件',
                    status: false
                }
            },
            methods:{
              getData(){
                  console.log(this.title)
              }  
            },
            components:{
                Test3
            }
        }
    </script>
    

    子组件1

    <template>
      <div>
        <h1>Test3 组件</h1>
        <br /><br />
        // 通过 $attrs(属性,除了【props中定义的属性】)  和 $listeners(方法)  来给嵌套子组件传递父组件的属性和方法
        <Test4   v-bind="$attrs" v-on="$listeners"/>
      </div>
    </template>
    
    <script>
    // 引入子子组件   
    import Test4 from "../components/Test4";
    export default {
      name: "test3",
      props: ["title"],
      components: {
        Test4,
      },
      created() {
        console.log(this.$attrs);  //{status: false}
        console.log("-----------");
        console.log(this.$listeners); // {getData: ƒ}
      },
    };
    </script>
    

    嵌套子组件

    <template>
        <div>
            <h1>Test4 组件</h1>
        </div>
    </template>
    
    <script>
        export default {
            name:'test4',
            created(){
                console.log('-----Test4------')
                console.log(this.$attrs) //{status: false}
                console.log(this.$listeners) // {getData: ƒ}
            }
        }
    </script>
    

    6. 跨组件之间传值

    vue .js

    /*
     * @Description: 
     * @Author: ZhangXin
     * @Date: 2021-01-22 15:48:56
     * @LastEditTime: 2021-01-22 15:51:24
     * @LastEditors: ZhangXin
     */
    
     import Vue from 'vue'
    
     export default new Vue()
    

    组件A

    <!--
     * @Description: 
     * @Author: ZhangXin
     * @Date: 2021-01-22 14:44:17
     * @LastEditTime: 2021-01-22 16:25:33
     * @LastEditors: ZhangXin
    -->
    
    <template>
        <div>  
            <button @click="changeValue">改变</button>
        </div>
    </template>
    
    <script>
    import zxVue from '../util/newVue.js';
        export default {
            name:'person',
            data(){
                return {
                    title:'personal 组件',
                    status: false
                }
            },
            methods:{
              changeValue(){
                 // 通过给 vue实例绑定事件
                 zxVue.$emit("getTitle", this.title)   
              }  
            }
        }
    </script>
    
    
    
    

    组件C

    <!--
     * @Description: 
     * @Author: ZhangXin
     * @Date: 2021-01-22 15:07:30
     * @LastEditTime: 2021-01-22 16:26:38
     * @LastEditors: ZhangXin
    -->
    <template>
      <div>
        <h1>Test4 组件</h1>
        <h1>{{ title }}</h1>
      </div>
    </template>
    
    <script>
    import zxVue from "../util/newVue";
    export default {
      name: "test4",
      data() {
        return {
          title: "test4",
        };
      },
      mounted(){
        // 通过 vue 实例.$on  监听事件名,来接收跨级组件传递过来的值
        zxVue.$on("getTitle", (item) => {
          this.title = item;
          console.log(item)
        });
    
      }
    };
    </script>
    
    

    7. Vuex

    8. provide inject 实现父组件向子孙孙组件传值。(层级不限)

    # provide
    //对象
    provide:{
        name:'测试'
    }
    //返回对象的函数
    provide(){
        return {
            name: '测试'
        }
    }
    
    #inject
    inject:['name']
    

    父组件

    <!--
     * @Description: 
     * @Author: ZhangXin
     * @Date: 2021-01-22 23:24:16
     * @LastEditTime: 2021-01-22 23:49:50
     * @LastEditors: ZhangXin
    -->
    <template>
        <div>
            <h1>我是父组件</h1>
            <Son />
        </div>
    </template>
    
    <script>
    import Son from '../components/son/SonOne'
        export default {
            name:'father',
            provide(){
                return {
                    titleFather: '父组件的值'
                }
            },
            components:{
                Son
            },
            data(){
                return{
                    title:'我是父组件 '
                }
            },
            
        }
    </script>
    
    
    

    子组件

    <template>
        <div>
            <h1>我是子孙组件</h1>
           
        </div>
    </template>
    
    <script>
    import SonTwo from '../son/SonTwo'
        export default {
            name:'sonone',
            components:{
               SonTwo
            },
            inject:['titleFather'],
            created(){
                 console.log(`${this.titleFather}-----------SonTwo`)
            },
            data(){
                return{
                    title:'我是子组件 '
                }
            },
            
        }
    </script>
    

    子孙组件

    <template>
        <div>
            <h1>我是子孙组件</h1>
           
        </div>
    </template>
    
    <script>
    import SonTwo from '../son/SonTwo'
        export default {
            name:'sonone',
            components:{
               SonTwo
            },
            inject:['titleFather'],
            created(){
                 console.log(`${this.titleFather}-----------SonTwo`)
            },
            data(){
                return{
                    title:'我是子组件 '
                }
            },
            
        }
    </script>
    
    

    起源地下载网 » Vue 组件通信的 8 种方式

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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