美文网首页
.sync原理(Vue组件父子传值)

.sync原理(Vue组件父子传值)

作者: 为光pig | 来源:发表于2020-12-02 10:33 被阅读0次

使用前提:

首先,我们需要明确的是,子父组件之间通讯,子组件是不能直接改变父组件的值的。(父组件是大佬,小弟不能改变大佬的值,但是父组件可以改变子组件的值)

作用:

通过某种方式,子组件可以”直接“改变父组件的值。

场景:

控制弹框的显示与关闭。在父组件中打开子组件弹框,然后在点击子组件中的按钮关闭弹框。

方法:

  1. 一般我们子父传值的处理如下:
// 父组件
<template>
   <div class="parent-file">
       <input type="button" value="打开子组件" @click="show">
       <!-- 子组件插槽 -->
       <child @changeVisibleState="changeVisible" :visible="childShow"/>
   </div>
</template>

<script>
import child from "./child"
   export default {
       data () {
           return {
               childShow: false
           }
       },
       components: {
           child
       },
       methods: {
           show(){
               this.childShow = true;
           },
           changeVisible (val) {
               this.childShow = val;
           }
       }
   }
</script>
// 子组件
<template>
    <div class="child-file">
        <input type="button" value="点我隐身" @click="doClose" v-show="visible">
    </div>
</template>

<script>
    export default {
        props: [ 'visible' ],
        methods: {
            doClose () {
                this.$emit("changeVisibleState", false)
            }
        }
    }
</script>

2. 改进:

这样的写法没错,但是显的比较臃肿,明明我只是要改一个值,就不能简单点?
答案是,当然是可以的。
大家肯定会想,那我不能直接改变父组件的值?想v-model那样,多爽。
vue也是考虑到了这点,所以提供了一个更好的解决方案

// 父组件
//  先把方法写到行内,箭头函数的写法。
//  方法名为什么是update:visible,是下面子组件的emit方法定义的。
<template>
    <div class="parent-file">
        <input type="button" value="打开子组件" @click="show">
        <!-- 子组件插槽 -->
        <child @update:visible="(val)=>{ childShow = val }" :visible="childShow"/>
    </div>
</template>

<script>
import child from "./child"
    export default {
        data () {
            return {
                childShow: false
            }
        },
        components: {
            child
        },
        methods: {
            show(){
                this.childShow = true;
            },
            // 以简化代码
            // changeVisible (val) {
            //     this.childShow = val;
            // }
        }
    }
</script>
// 子组件
<template>
    <div class="child-file">
        <input type="button" value="点我隐身" @click="doClose" v-show="visible">
    </div>
</template>

<script>
    export default {
        props: [ 'visible' ],
        methods: {
            doClose () {
                // 修改前代码
                // this.$emit("changeVisibleState", false)

                // 改变写法
                this.$emit("update:visible",false);
            }
        }
    }
</script>

3. 最后:

对于 @update:visible="(val)=>{childShow = val}" :visible="childShow",vue提供了一个语法糖,将其替换成 :visible.sync = "childShow" ,这样是不是看起来简洁多了。

那么就变成了:

<template>
    <div class="parent-file">
        <input type="button" value="打开子组件" @click="show">
        <!-- 子组件插槽 -->
        <child :visible.sync = "childShow"/>
    </div>
</template>

<script>
import child from "./child"
    export default {
        data () {
            return {
                childShow: false
            }
        },
        components: {
            child
        },
        methods: {
            show(){
                this.childShow = true;
            },
            // 以简化代码
            // changeVisible (val) {
            //     this.childShow = val;
            // }
        }
    }
</script>
// 子组件
<template>
    <div class="child-file">
        <input type="button" value="点我隐身" @click="doClose" v-show="visible">
    </div>
</template>

<script>
    export default {
        props: [ 'visible' ],
        methods: {
            doClose () {
                // 修改前
                // this.$emit("changeVisibleState", false)

                // 改变写法
                // 注意:emit中的函数名,一定要以这种格式"update:props"命名,其中props就是我们子父之间通讯的值
                this.$emit("update:visible", false);
            }
        }
    }
</script>

相关文章

  • vue 父子组件传值 $on sync v-model

    1、正常的父子组件传值2、使用sync 实现父子组件传值3、使用v-model实现父子组件传值

  • .sync原理(Vue组件父子传值)

    使用前提: 首先,我们需要明确的是,子父组件之间通讯,子组件是不能直接改变父组件的值的。(父组件是大佬,小弟不能改...

  • (VUE3) 四、组件传值(父子组件传值 & 祖孙组件传值 &v

    1.父子组件传值 vue2中的父子组件传值:父组件: 子组件: vue3中的父子组件传值: 还是用props接收父...

  • Vue父子组件通信和双向绑定

    本篇文章主要介绍父子组件传值,组件的数据双向绑定。 1. 基础父子组件传值 父子组件传值,这是Vue组件传值最常见...

  • VUE组件(传值,生命周期)

    VUE生命周期 VUE子传父组件通信 VUE非父子组件传值

  • 组件通信

    vue传值可分为父子之间传值、兄弟组件之间传值、跨代组件之间传值 1.父子之间传值:可以使用$emit/props...

  • Vue组件之间的传值

    Vue父子组件之间的传值(props)兄弟组件 VUEX

  • 前端基础搬运工-VUE模块

    十、VUE模块 基础部分 1. Vue组件间传值 答: -[ ] 1.父子之间的传值 父组件向子组件传值通过p...

  • 2019-03-13

    vue父子组件传值,(父组件向子组件传值用prop ,子组件向父组件传值:子组件调用父组件方法值以参数的方式传递)...

  • 2019-03-13

    vue父子组件传值,(父组件向子组件传值用prop ,子组件向父组件传值:子组件调用父组件方法值以参数的方式传递)...

网友评论

      本文标题:.sync原理(Vue组件父子传值)

      本文链接:https://www.haomeiwen.com/subject/yjjywktx.html