Vue 中的父子组件沟通

1. 父子组件传值

Vue 中,父组件传值给子组件,是通过子组件上绑定的 props值。

子组件给父组件传值,并不是直接修改父组件的值,而是通过$emit 触发父组件上的事件,并将值传给父组件,由父组件自己更新对应的值

下面的例子,父组件通过 :post 将 data 中的post 值传给子组件的porp: ‘post’ ,

子组件中 button 按钮,点击后通过 $emit 触发父组件的 enlarge-text 事件,同时 $emit 的第二个参数会传给父组件的 enlarge-text 事件。父组件通过 $event 获取子组件传来的值。

/* 父组件中使用的子组件 */

<div id="app">
    <blog-post :post="post" :style="{fontSize: postFontSize+ 'px'}"
        	   @enlarge-text = "postFontSize+= $event">
	</blog-post>
</div>	
// 定义子组件 blog-post

Vue.component('blog-post',{
        props: ['post'],
        template: `
            <div>
                <h3>{{post.title}}</h3>
                <button @click="$emit('enlarge-text', 1)">
                    Enlarge text
                </button>
                <div v-html="post.content"></div>
            </div>
        `,
    });
// 生成 Vue 实例

let app = new Vue({
        el: '#app',
        data(){
            return {
                post:{ id: 1, title: 'My journey with Vue', content: 'dgdsfhghfh'},                
                postFontSize : 15,               
            }
        }
    });

页面效果如下, 点击 Enalrge text 按钮,字体会变大:
在这里插入图片描述

2. 父子组件沟通的语法糖: v-bind修饰符 sync 和 v-model

  • v-bind 修饰符 sync

    相当于是在父组件绑定了update:prop 事件,将 v-bind 绑定的值传给子组件,
    子组件通过$emit触发 update:prop 事件,将 prop 更新的值回给父组件

    /* 父组件中使用的子组件 */
    <div id="app">
        {{number}}
    	<add-num :num.sync="number"></add-num>
    </div>
    
    // 定义子组件
    
    Vue.component('add-num',{
        props:['num'],
        template: `
            <div>
                <button @click="addNum">Add</button>
            </div>
        `,
        data(){
            return {
                number: this.num
            }
        },
        methods:{
            addNum(){
                this.number++;
                this.$emit('update:num', this.number)
            }
        }
    });
    
    // 生成 Vue 实例
    
    let app = new Vue({
            el: '#app',
            data(){
                return {               
                    number:1               
                }
            }
        });
    

    页面效果:点击加号,数字加1
    在这里插入图片描述

  • v-model

    相当于在父组件上绑定了 input 事件,把value值传给子组件,子组件通过$emit触发input事件,并将该改变的value值回传给父组件,实现数据的双向绑定

    /* 父组件中使用的子组件 */
    <div id="app">
         搜索内容:{{searchText}}
         <custom-input v-model="searchText"></custom-input>
    </div>
    
    // 定义子组件
    Vue.component('custom-input',{
            props:['value'],
            template: `
                <input :value="value"
                @input="$emit('input', $event.target.value)"
                >
            `,
        });
    
    // 生成 Vue 实例
    
    let app = new Vue({
            el: '#app',
            data(){
                return {               
                    searchText:'新闻',               
                }
            }
        });
    

    页面效果: 在搜索框输入什么,前面就会显示什么

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值