javascript - 如何将 v-model 添加到组件中动态添加的 html 输入
问题描述
我有这个组件,然后,在异步请求之后,我需要创建一个新的输入并给它一个 v-model 出价,这可能吗?
<template>
<div>
<div id="newInputsWrapper">
</div>
</div>
</template>
<script>
export default {
data () {
return {
foo:''
}
},
mounted () {
//Simulating asynchronous request
setTimeout(function(){
document.getElementById('newInputsWrapper').innerHTML = '<input type="text" v-model="hereAnymodel">'
//....maybe I will need to add more generated inputs...
},2000);
}
}
</script>
<style>
</style>
解决方案
在 vue 中,您不会使用选择器修改 html/模板,至少在常见情况下不会。使您的异步请求修改组件中的变量。然后使用你的那个变量在你的模板中渲染东西。
你会得到这样的东西。fields
在这里,我们用一些标签和 ID填充变量。id 被映射到我们名为 的表单数据变量form
。我们填充它以防止v-model
对不存在的变量可能的时髦。我们稍后可以使用我们的form
变量来做各种事情。
<template>
<div>
<h2>All kind of things</h2>
<template v-for="field in fields">
<label :key="field.id">{{ field.label }} <input type="text" v-model="form[field.id]" /></label>
</template>
</div>
</template>
<script>
export default {
data() {
return {
fields: [],
form: {}
};
},
watch: {
fields(fields) {
for (const field of fields) {
if (this.form[field.id] === undefined) {
this.$set(this.form, field.id, "");
}
}
},
form: {
deep: true,
handler(newForm) {
console.log("Looks like our data has been changed!", newForm);
}
}
},
mounted() {
//Simulating asynchronous request
setTimeout(() => {
this.fields = [
{ id: "a", label: "Label a" },
{ id: "b", label: "Label b" },
{ id: "c", label: "Label c" },
{ id: "d", label: "Label d" }
];
}, 2000);
}
};
</script>
<style>
label {
display: block;
}
</style>
推荐阅读
- floating-point - 是否可以通过在 VM 中运行程序来获得物理机之间的浮点确定性?
- javascript - 关于 LeetCode 77 (javascript) 的未定义错误
- c# - C# 从最后一个 JSON 对象迭代到第一个对象
- javascript - Electron webContents.send 并不总是有效
- orocommerce - OroCommerce:自定义订单视图页面上的按钮?
- reactjs - 无法通过 Ubuntu 服务器上的 LAN 在 iPad 上加载 React App 的本地部署
- python - 2 个不同寄存器的两个相同值 - minimummodbus
- unity3d - Collider2D.bounds 解释
- google-cloud-data-fusion - 在云数据融合中读取和转换 parquet 文件
- r - 如何从 me.weighted() 计算单个组件和组合组件的概率密度