7***@qq.com
7***@qq.com
  • 发布:2019-12-26 21:52
  • 更新:2019-12-26 21:52
  • 阅读:1416

父子组件单向数据流影响表单组件 <input>等的双向数据绑定v-model指令功能

分类:uni-app

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。

通常我们需要对表单元素封装组件以灵活复用,这时候会发现一个如题问题,举例说明:
父组件:

<template>  
    <view>  
        <view class="title">实时获取输入值:{{value}}</view>  
        <myInput  :value="value"></myInput>  
    </view>  
</template>  
<script>  
    import myInput  from "./myInput.vue";  
    export default {  
        components:{myInput},  
        data() {  
            return {  
                value:''  
            }  
        }  
    }  
</script>

子组件:

<template>  
    <input class="uni-input" v-model="value"  placeholder="输入值" />  
</template>  
<script>  
    export default {  
        props: {  
            value:String  
        }  
    }  
</script>

运行结果:

对于这个令人失望的结局,我们只能不厌其烦,看官方是否有提供方案

在有些情况下,我们可能需要对一个 prop 进行“双向绑定”。不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以修改父组件,且在父组件和子组件都没有明显的改动来源。
这也是为什么我们推荐以 update:myPropName 的模式触发事件取而代之。

解决方案:
父组件:

<template>  
    <view>  
        <view class="title">实时获取输入值:{{value}}</view>  
        <myInput  :value.sync="value"></myInput>  
    </view>  
</template>  
<script>  
    import myInput  from "./myInput.vue";  
    export default {  
        components:{myInput},  
        data() {  
            return {  
                value:''  
            }  
        }  
    }  
</script>

子组件:

<template>  
    <input class="uni-input" @input="$emit('update:value',$event.target.value)" placeholder="输入值" />  
</template>  
<script>  
    export default {  
        props: {  
            value:String  
        }  
    }  
</script>

虽说实现了,但这个方案无疑平白增加了工作量,怎么才能简单使用v-model实现父子组件的双向数据绑定呢
经过不懈测试,还是发现了一个投机取巧方法
父组件:

<template>  
    <view>  
        <view class="title">实时获取输入值:{{form.inputValue}}</view>  
        <myInput  :form="form"></myInput>  
    </view>  
</template>  
<script>  
    import myInput  from "./myInput.vue";  
    export default {  
        components:{myInput},  
        data() {  
            return {  
                form:{  
                    inputValue:''  
                }  
            }  
        }  
    }  
</script>

子组件:

<template>  
    <input class="uni-input" v-model="form.inputValue"  placeholder="输入值" />  
</template>  
<script>  
    export default {  
        props: {  
            form:Object  
        }  
    }  
</script>

因为官方方案对于各种表单组件封装来说真的麻烦了太多,千不该万不该,终还是选择了取巧方式
报应来了,测试时使用的
HBuilder X 2.2.2.20190816编译,H5及app端都没问题,升级到
HBuilder X 2.4.6.20191210编译,H5没问题,app端出问题了
我的表单组件输入数据显示正常,实际没有更新到父组件以收集数据,完蛋,怎么办?

2019-12-26 21:52 负责人:无 分享
已邀请:

该问题目前已经被锁定, 无法添加新回复