vuejs2 - 在 vuejs 2 中将多个 v-model 附加到动态子组件的循环中
问题描述
最近我遇到了一个问题,我必须在一个循环中显示许多不同的组件,但是:它们中的每一个都应该与父级共享它的状态(有点挖空.js 风格)。我正在通过文档进行挖掘,其中明确指出,Vue.js 将属性以一种方式传递给孩子,而这些最终可以与某些事件发生对话。另外,文档说每个组件只能有一个 v-model,所以最后我想出了这样的东西:
<li :is="field.type" v-for="(field, i) in fields" :key="i" :title="field.title" v-on:title-change="title = $event" :somevalue="field.somevalue" v-on:somevalue-change="somevalue = $event"></li>
等等……然而,在第五个参数之后,我很快意识到代码基本上是混乱的。是否有一些不那么混乱的方法可以将多个双向数据绑定附加到子组件?
解决方案
解决方案恰好是.sync
事件的方法和正确命名。虽然同步在 vue.js 2 中已被弃用和删除,但由于 2.3 版本已被重写并以某种类似的形式再次添加。事实上,它只是一种合成糖,我相信我的组件现在看起来更体面了。
<ol>
<li :is="field.type"
v-for="(field, i) in fields"
:key="field.id"
v-bind.sync="field"
v-on:remove="fields.splice(i, 1)"></li>
</ol>
Vue.component('bool', {
template: '\
<li>\
<input type="text" v-bind:value="title" @input="$emit(\'update:title\', $event.target.value)">\
<button v-bind:value="value" @click="$emit(\'update:value\', !$event.target.value)" :class="{active: value}">{{value}}</button>\
<input type="checkbox" value="1" v-bind:checked="istrue" @change="$emit(\'update:istrue\', $event.target.checked)">\
<button @click="$emit(\'remove\')">Remove</button>\
</li>\
',
data () {
return {}
},
props: ['title', 'value', 'availablevalues']
})
推荐阅读
- javascript - 在动态生成的表行上显示模式单击包含来自相应行的数据
- r - 如何根据日期值对特定列重新排序?
- javascript - 需要一些帮助来理解 javascript 变量范围
- maven - 在 Maven 中,我可以将 Zip 存档中的 JEE 项目打包到 SQL 脚本中吗?
- excel - 为什么 Excel 在环绕 AND 时不会失败?
- ios - UITableView Swift 中的断言失败
- javascript - 是否可以使用 node.js 获取已安装的 Windows 更新列表?
- c++ - std::ifstream 和读取文件
- css - 物化预构建主题不适用
- api - Api Token Authentication - 通过参数或标头?