我无法动态设置 v-model 。
如果我明确输入,它会起作用:
<div class="form-group mr-3 mb-2">
<input type="text"
v-model="form[filters][firstlastname]"
>
</div>
Run Code Online (Sandbox Code Playgroud)
但我想循环遍历一个包含 string 的对象,例如: 'form[filters][firstlastname]'
父级的表单具有以下属性:
data() {
return {
form: new Form({
filters: {
gender: [],
firstlastname: 'My firstlastname'
Run Code Online (Sandbox Code Playgroud)
因此,我从父组件将表单和过滤器传递到子组件中,这里是过滤器:
let formFilters = { filters: [
{
type: 'text',
property: 'form[filters][firstlastname]', // <-- string
placeholder: 'Name',
},
{
type: 'number',
property: 'paginate',
placeholder: 'Max rows'
},
]
}
Run Code Online (Sandbox Code Playgroud)
子组件:(这里我循环遍历对象并生成输入字段)
<div v-for="(filter,index) in formFilters.filters"
:key="`${index}_${filter.property}`"
>
<input
v-if="filter.type === 'text' || filter.type === 'number'"
:placeholder="filter.placeholder"
:type="filter.type"
v-model="filter.property" //<--- set the property
>
Run Code Online (Sandbox Code Playgroud)
这是行不通的。v-model 只是将其解释为字符串,而不是对表单属性的引用。我测试了其他方法,例如:(v-model="``${[filter.property]}``"单个,不是双````,但它不会在 stackoverflow 中显示,否则)和其他疯狂的东西,但它是无效的。
那么如何使用包含字符串的变量设置 v-model (以便可以动态设置)?
小智 5
这是一个非常棘手的问题......
您可以使用两种方式访问data内部 html 模板中存在的任何属性,
$datadata() {
return {
firstlastname: 'Mr First last name'
}
}
Run Code Online (Sandbox Code Playgroud)
所以,在 html 模板中你可以使用
<p>{{firstlastname}}</p>
或者
<p>{{$data.firstlastname}}</p>
对于您的场景$data,可用于原始数据类型,如字符串或数字,
<input
v-if="filter.type === 'text' || filter.type === 'number'"
:placeholder="filter.placeholder"
:type="filter.type"
v-model="$data[filter.property]">
Run Code Online (Sandbox Code Playgroud)
但这不适用于您尝试访问对象的嵌套属性的第二种情况form.filters.firstlastname
您可以使用以下表示法访问此属性$data[form][filters][firstlastname]
在您的情况下,for循环将导致$data[form.filters.firstlastname]或$data[[form][filters][firstlastname]]将引发异常
如注释中所建议的,尝试不同的方法或压平物体。您可以参考此链接了解如何展平对象/sf/answers/1775937551/
| 归档时间: |
|
| 查看次数: |
6495 次 |
| 最近记录: |