所有的 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端出问题了
我的表单组件输入数据显示正常,实际没有更新到父组件以收集数据,完蛋,怎么办?
0 个回复