zoukankan      html  css  js  c++  java
  • Vue父子组件之间的通信

    父组件向子组件传递数据

    定义父子组件的模板

    <!--父组件模板-->
    <div id="app">
        <!--把父组件的msg和str,传给组件cmsg和cstr-->
        <cpn :cmsg="msg" :cstr="str"></cpn>
    </div>
    
    <!--子组件模板-->
    <template id="mycpn">
        <!--组件里,最好有一个div作为根元素-->
        <div>
            <h2>{{cstr}}</h2>
            <ul>
                <li v-for="(item,index) in cmsg">{{item}}</li>
            </ul>
        </div>
    </template>

    父传子通常使用props,我们只需要在子组件使用props

    // const cpn = {template:"",props:{}};//写法跟Vue.extend不同,内容一样
        const cpn = Vue.extend({//设置子组件
            template:"#mycpn",
            props:{//在子组件定义cstr和cmsg属性
                cstr:{
                    type:String,//默认String类型
                    default() {//默认值
                        return "";
                    }
                },
                cmsg:{
                    type: Array,
                    default() {
                        return [];
                    }
                }
            }
        });
    
        //父组件
        const app = new Vue({
            el:"#app",
            data() {
                return {//定义属性,传值给子组件
                    str:"这里是父组件传值给子组件",
                    msg:["传值1","传值2","传值3","传值4"]
                }
            },
            components:{//注册组件
                cpn
            }
        })

    注:HTML 中的 attribute 名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。这意味着当你使用 DOM 中的模板时,camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名

    子组件向父组件传递数据

    定义父子组件的模板

    <!--父组件模板-->
    <div id="app">
        <!-- itemclick是子组件$emit自定义事件,
             btn是父组件事件,
            不写参数默认传递cbtn的item
         -->
        <cpn @itemclick="btn"></cpn>
    </div>
    
    <!--子组件模板-->
    <template id="mycpn">
        <div>
            <button v-for="(item,index) in cmsg" @click="cbtn(item)">{{item.name}}</button>
        </div>
    </template>

    子传父使用$emit

    //设置子组件
        const cpn = {
            template:"#mycpn",
            data(){
                return {
                    cmsg:[
                        {
                            id: '1',
                            name: '热门推荐'
                        },
                        {
                            id: '2',
                            name: '手机数码'
                        },
                        {
                            id: '3',
                            name: '家用家电'
                        },
                        {
                            id: '4',
                            name: '电脑办公'
                        }
                    ]
                }
            },
            methods: {
                cbtn(item) {
                    //定义itemclick事件,通过$emit传值
                    this.$emit('itemclick', item)
                }
            }
        }
    
        //父组件
        const app = new Vue({
            el:"#app",
            methods:{
                btn(item) {//获取子组件的值
                    console.log(item);
                }
            },
            components:{
                cpn
            }
        });

    组件的双向绑定

    在Vue开发中双向绑定常用,现在的需求是子组件的input修改了数据,父组件的数据就立刻更新

    <div id="app">
        <!-- cnum1把父传子,@dcinp1父接收子的值-->
        <cpn :cnum1="num1" :cnum2="num2" @dcinp1="acinp1" @dcinp2="acinp2"></cpn>
    </div>
    
    <template id="cpn">
        <div>
            <h3>props:{{cnum1}},子组件data:{{dcnum1}}</h3>
            <input v-model="dcnum1" @input="inpNum1">
            <h3>props:{{cnum2}},子组件data:{{dcnum2}}</h3>
            <input v-model="dcnum2" @input="inpNum2">
        </div>
    </template>
        //设置子组件
        const cpn = {
            template:"#cpn",
            data(){
                return {//与子组件的input同步的数据
                    dcnum1:this.cnum1,
                    dcnum2:this.cnum2
                }
            },
            methods:{
                inpNum1(event){
                    //子组件input输入时,同步cpn的data的值
                    this.dcnum1 = event.target.value;
                    //子把值传给父的num1,与num1同步
                    this.$emit("dcinp1",this.dcnum1)
                },
                inpNum2(event) {
                    this.dcnum2 = event.target.value;
                    this.$emit("dcinp2",this.dcnum1)
                }
            },
            props:{
                cnum1:Number,
                cnum2:Number
            }
        }
    
        //父组件
        const app = new Vue({
            el:"#app",
            data() {
                return {
                    num1:1,
                    num2:2,
                }
            },
            methods:{
                acinp1(value){//获取子组件传给来的值
                    this.num1 = parseInt(value);
                },
                acinp2(value) {
                    this.num2 = parseInt(value);
                }
            },
            components:{
                cpn
            }
        })
  • 相关阅读:
    Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-C. Plasticine zebra
    牛客网-小白月赛6-J-洋灰三角
    树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花
    BZOJ-4318-OSU!期望DP
    Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-D- Array Restoration
    Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-C-Bracket Subsequence
    Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-A-Single Wildcard Pattern Matching
    Codeforces Round #503 (by SIS, Div. 2)-C. Elections
    百度之星-day1-1003-度度熊剪纸条
    百度之星-day2-1004-二分答案
  • 原文地址:https://www.cnblogs.com/bushui/p/13061711.html
Copyright © 2011-2022 走看看