vue 父组件向子组件通过props传递不同数据类型的问题

父组件代码

    <template>
        <div>
            <item1 :test="{test:1}"></item1>
            //
            //
        </div>
    </template>

子组件代码

<template>
    <div>
    通过v-model来改
        //
        <input v-model="test[0]">
        <input v-model="test">
    </div>
</template>
<script>
    export default {
    //如果props传过来是对象和数组的话,直接修改是没有报错的
    //需要注意的是,子组件改对象或数组内容的话会直接影响到父组件的东西,所以这时涉及到一个深度克隆的问题。
    //如果是传过来是字符串的话,那就报错了,报的是“违背了单向数据流”的问题
        props: {
            test: Object,
            //test: Array,
            //test: String,
        }//或者通过手动来改
        methods:{
         //control(){
           //this.test.test = 123
           //this.test[0] = 123
           //this.test = 123
         }
        }
    }
</script>

字面意思很清楚了解决办法是将msg赋值给一个子组件自定义的参数,然后通过这个自定义的参数来改变子组件msg(不能改变父组件的)
又或者是通过 e m i t 和 emit和 emiton来改变父组件msg的值

总结

1.如果父祖件传过来的是基本数据类型,其实子组件用v-model一样可以改,给你报的是warning而不是报错,也就是说,vue是可以由子组件直接修改父祖件的值的,只是 强烈不推荐。

2.为什么基本数据类型会报warning而复杂数据类型不会?这考的纯粹就是你对js里两种数据类型的内存的理解,网上搜索详细的资料有很多,展开讲也能讲很多,题主可以按需补相关的知识。

3.最后,尤雨溪本人不反对这种方式,可以作为一个父子组件间双向通信的简易方案。

以后如果再碰到类似,父组件传对象或者数组值到子组件中进行更新,然后将改变的值返回父组件的场景时,可以不用 e m i t 和 emit和 emiton这种方式来实现了,直接改变数据就行了。

参考了以下这几个链接:
https://segmentfault.com/q/1010000008525755/a-1020000008542156
https://blog.csdn.net/qq_40816649/article/details/88815242
https://segmentfault.com/q/1010000015478461
https://blog.csdn.net/qq_40816649/article/details/88815242

你可能感兴趣的:(vue,js,vue)