vue中父子组件传值,props方法一般单向数据流,vue中是不是允许直接修改的,但是在实现业务中有时需要在在子组件中修改父组件的值,这里就巧妙用到了vue .sync修饰符来实现。
先看官方文档
实现一个双向数据绑定,子组件改变的时候,父组件也在改变,第一次父组件通过props
传值给子组件。
父组件代码
<template> <div class="home"> <img alt="Vue logo" src="../assets/logo.png"> <child :titleSync.sync="title"/> <br> <span>{{ '我是父组件:' + title}}</span> </div> </template> <script> import Child from '../components/Child' export default { name: 'home', components: { Child, }, data() { return { title: 'sync测试用例', } } } </script>
子组件代码
<template> <div> -----------------Child------------------ <input type="text" v-model="config"> </div> </template> <script> export default { name: 'Child', props: { titleSync: String, }, computed: { config: { get() { return this.titleSync }, set(val) { this.$emit('update:titleSync', val) } } } } </script> <style> </style>
效果图:
2、点击子组件按钮点击事件修改父组件数据
父组件代码:
<template> <div class="home"> <img alt="Vue logo" src="../assets/logo.png"> <child :nameSync.sync="name"/> <br> <span>{{ '我是父组件:' + name}}</span> </div> </template> <script> import Child from '../components/Child' export default { name: 'home', components: { Child }, data() { return { title: 'sync测试用例', name: '我是sync的第二个测试用例' } } </script>
子组件代码:
<template> <div> -----------------Child------------------ <br> <button @click="syncClick">点击更改名字</button> </div> </template> <script> export default { name: 'Child', props: { nameSync: String, }, data() { return { name: '张三' } }, methods: { syncClick() { this.$emit('update:nameSync', this.name) } }, } </script>
总结:就是利于了this.$emit绑定update:nameSync事件,同时在父组件使用了.sync修饰符后,绑定的nameSync值会自动更新修改。
在些扩展一个功能,在传后给子组件后,此父组件中有一个事件修改值了,此是子组件中是识别不了的。需要在子组件中增加一个wacth监听父组件值,再克隆到子组件中。
父组件代码:
<template> <div class="home"> <img alt="Vue logo" src="../assets/logo.png"> <child :nameSync.sync="name"/> <button @click="update">点击更改</button> <br> <span>{{ '我是父组件:' + name}}</span> </div> </template> <script> import Child from '../components/Child' export default { name: 'home', components: { Child }, data() { return { title: 'sync测试用例', name: '我是sync的第二个测试用例' } }, update(){ this.name="父中修改了值" } </script>
子组件代码:
<template> <div> -----------------Child------------------ <br> <span>{{ '我是父组件:' + sonName}}</span> <button @click="syncClick">点击更改名字</button> </div> </template> <script> export default { name: 'Child', props: { nameSync: String, }, data() { return { sonName: '张三' } }, watch: { nameSync(val) { this.sonName= val; }, }, methods: { syncClick() { this.$emit('update:nameSync', "子组件中修改了") } }, } </script>