美文网首页web前端
vue双向数据流动的场景

vue双向数据流动的场景

作者: 姜治宇 | 来源:发表于2020-05-22 18:47 被阅读0次

vue是单向数据流动的,不过有些应用场景是双向流动的,比如选择一个用户列表组件,当你点开这个组件时会传一个数组chooseList,chooseList表示已选择的用户,进到页面要是已勾选状态,而在这个用户组件还可以勾选更多用户,这样会改变原来的chooseList,这种情况下我们应该如何处理呢?
我们可以用属性props传chooseList数组,而在组件内部改变chooseList的话,就要使用事件$emit。
父组件:

<template>
    <div>
        <receiver :choose-list="chooseData" :all-data="usersData" @changeList="changeList"></receiver>
    </div>

</template>


<script>
    import receiver from '@/components/receiver'

    export default {
        name: "test",
        components: {receiver: receiver},
        methods:{
            changeList(newdata){
                this.chooseData = newdata // 在这里改变chooseData,不能直接在子组件直接改!

            },
        },
        data() {
            return {
                chooseData: [1, 2],
                usersData: [{userId: 1, name: '张三'},
                    {userId: 2, name: '李四'},
                    {userId: 3, name: '王五'},
                    {userId: 4, name: '六子'}
                ]
            }
        },

    }
</script>

<style scoped>

</style>

子组件:

<template>
    <div>
        <button @click="chooseUser"></button>
    </div>
</template>

<script>
    export default {
        name: "receiver",
        props: {
            chooseData: {//不能直接改
                required: true,
                type: Array,

            }
        },
        mounted(){
            this.dataList = JSON.parse(JSON.stringify(this.chooseData))//拷贝一份数据,防止篡改源数据

        },
        methods:{
            chooseUser(){
                this.dataList.push(3)//改动了dataList,不会影响到源数据
                this.$emit('changeList', this.dataList)//将修改后的数据传回父组件
            }
        },
        data() {
            return {
                dataList:[]
            }
        }
    }

</script>

<style scoped>

</style>

虽然这么实现看起来有点繁琐,但好处是很多的。
因为这样实现没有破坏单向数据流动,当子组件数据发生改变时通知到父组件,父组件更新数据后再传回给子组件,这样你再次进入子组件就是最新的视图了,否则mounted钩子只会执行一次,你只能使用watch强行监听变化。

相关文章

  • vue双向数据流动的场景

    vue是单向数据流动的,不过有些应用场景是双向流动的,比如选择一个用户列表组件,当你点开这个组件时会传一个数组ch...

  • Vue2.0中的异步队列

    在vue的体系中,数据的双向绑定主要通过 Object.defineProperty 进行数据从模型到视图的流动及...

  • Vue 中的双向数据绑定

    双向绑定 单向数据流 双向绑定 or 单向数据流 Vue 是单向数据流,不是双向绑定 Vue 的双向绑定是语法糖 ...

  • Vue提问系列

    1、说下Vue数据双向绑定的原理2、说说Vuex的作用以及应用场景3、说说Vue组件的数据通信方式4、Vue的源码...

  • vue 双向数据绑定

    Vue实现数据双向绑定的原理:Object.defineProperty()vue实现数据双向绑定主要是:采用数据...

  • 02Vue.js的数据绑定

    理解Vue的双向数据绑定 Vue有一个显著的地方就是它拥有双向数据绑定功能,那么何为双向数据绑定呢?双向是指:HT...

  • Vue实现数据双向绑定的原理

    Vue实现数据双向绑定的原理:Object.defineProperty() vue实现数据双向绑定主要是:采用数...

  • 深入Vue响应式原理

    1.Vue的双向数据绑定 参考 vue的双向绑定原理及实现Vue双向绑定的实现原理Object.definepro...

  • Vue入门(二)——数据绑定

    一、什么是双向数据绑定 双向数据绑定是Vue的核心功能之一。所谓双向数据绑定是指:HTML标签上的数据绑定到Vue...

  • 如何用js手动实现一个数据双向绑定

    双向数据绑定: 我们这里拿vue举例,vue中的双向数据绑定主要是利用Object.defineProperty(...

网友评论

    本文标题:vue双向数据流动的场景

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