Vue子组件给父组件传值的四种方法
Vue 父组件给子组件传值后,子组件不能直接修改该值,否则无法与父组件保持一致。正确的做法是告知父组件,让父组件修改该值,然后父组件自动同步给子组件。
子组件给父组件传值有以下四种方法(基于 Vue 2.x):
1、自定义事件
父组件:
<div id="app"> <div>父组件的内容:我叫 {{ name }},我的年龄是 {{ age }}</div> <child :name="name" :age="age" @update_name="updateNameFromChild" @update_age="updateAgeFromChild" ></child> </div> <script src="vue.min.js"></script> <script src="child-one.js"></script> <script> var app = new Vue({ el: '#app', data: { name: 'Tom', age: 23 }, methods: { updateNameFromChild(val) { this.name = val }, updateAgeFromChild(val) { this.age = val } } }) </script>
子组件:
var child = Vue.component('child', { template: `<p @click="update">子组件的内容:我叫 {{ name }},我的年龄是 {{ age }}<span>(点击我)</span></p>`, props: ['name', 'age'], methods: { update() { this.$emit('update_name', 'Lili') this.$emit('update_age', 19) } } })
2、@update
父组件:
<div id="app"> <div>父组件的内容:我叫 {{ name }},我的年龄是 {{ age }}</div> <child :name="name" :age="age" @update:name="val => name = val" @update:age="val => age = val" ></child> </div> <script src="vue.min.js"></script> <script src="child-two.js"></script> <script> var app = new Vue({ el: '#app', data: { name: 'Tom', age: 23 } }) </script>
子组件:
var child = Vue.component('child', { template: `<p @click="update">子组件的内容:我叫 {{ name }},我的年龄是 {{ age }}<span>(点击我)</span></p>`, props: ['name', 'age'], methods: { update() { this.$emit('update:name', 'Lili') this.$emit('update:age', 19) } } })
3、.sync(推荐)
父组件:
<div id="app"> <div>父组件的内容:我叫 {{ name }},我的年龄是 {{ age }}</div> <child :name="name" :age="age" :name.sync="name" :age.sync="age"></child> </div> <script src="vue.min.js"></script> <script src="child-three.js"></script> <script> var app = new Vue({ el: '#app', data: { name: 'Tom', age: 23 } }) </script>
子组件:
var child = Vue.component('child', { template: `<p @click="update">子组件的内容:我叫 {{ name }},我的年龄是 {{ age }}<span>(点击我)</span></p>`, props: ['name', 'age'], methods: { update() { this.$emit('update:name', 'Lili') this.$emit('update:age', 19) } } })
4、$parent
父组件:
<div id="app"> <div>父组件的内容:我叫 {{ name }},我的年龄是 {{ age }}</div> <child :name="name" :age="age"></child> </div> <script src="vue.min.js"></script> <script src="child-four.js"></script> <script> var app = new Vue({ el: '#app', data: { name: 'Tom', age: 23 } }) </script>
子组件:
var child = Vue.component('child', { template: `<p @click="update">子组件的内容:我叫 {{ name }},我的年龄是 {{ age }}<span>(点击我)</span></p>`, props: ['name', 'age'], methods: { update() { this.$parent.name = 'Lili' this.$parent.age = 19 } } })
标签:Vue.js