javascript - 如何在vue中动态附加输入元素
问题描述
我正在尝试根据条件附加新的输入字段,我将描述工作流程以帮助您理解
第一阶段是按下此按钮以实现 2 个功能(1 是移动到分阶段表单中的其他字段集,第二个功能是附加输入:
<input type="button" name="secondBtn" class="next action-button" value="Next" id="secondBtn" @click="nextPlusappend"/>
nextPlus 附加:
nextPlusappend() {
this.isNextClicked();
this.appendFields();
}
附加字段:
//this.platform initllized as 'one' so the condition is true.
if(this.platform === 'one'){
this.inputFields.push({
Username: '',
Password: '',
AffiliateID: '',
CI: '',
GI: '',
})
}
我想将函数中的所有字段附加到这个字段集中:
<div v-if="currentPage === 2">
<fieldset id="fieldset3" v-for="(param, index) in inputFields" :key="index">
<h2 class="fs-title">API Credentials</h2>
<h3 class="fs-subtitle">Step 3- Add any parameter for the integration</h3>
<input v-model="param.Username" type="text" name="`inputFields[${index}[Username]]`" placeholder="userName">
<input type="button" name="previous" class="previous action-button" value="Previous" @click="isPreviousClicked"/>
<input type="submit" name="submit" class="submit action-button" value="Create a Ticket" id="excel"/>
</fieldset>
</div>
我如何在没有硬编码所有输入字段的情况下附加它,就像我在这里所做的那样:?
<input v-model="param.Username" type="text" name="`inputFields[${index}[Username]]`" placeholder="userName">
这被指定为动态的,我是什么意思?我的意思是,如果 this.platform 等于“one”,就会有一个唯一的字段,如果 this.platform 等于“two”,例如会有其他的唯一字段。
解决方案
不要像“推送一个表单域”那样思考,而应该像“向数据集添加一个新项目”那样思考(当然,它显示的 UI 是一个表单域)。
让我举个例子:
Vue.component("FormField", {
props: ["label", "value"],
computed: {
val: {
get() {
return this.value
},
set(val) {
this.$emit("update:value", val)
}
},
},
methods: {
handleClickAdd() {
this.$emit("click-add-field")
}
},
template: `
<div>
<label>
{{ label }}: <input type="text" v-model="val" />
</label>
<button
@click="handleClickAdd"
>
+ ADD
</button>
</div>
`,
})
new Vue({
el: "#app",
data() {
return {
formFields: [{
label: "Field 1",
value: null,
}],
}
},
methods: {
handleClickAddField() {
const item = {
label: `Field ${ this.formFields.length + 1 }`,
value: null,
}
this.formFields = [...this.formFields, item]
},
},
template: `
<div
class="container"
>
<div
class="col"
>
<h4>FIELDS:</h4>
<hr>
<form-field
v-for="(field, i) in formFields"
:key="i"
:label="field.label"
:value.sync="field.value"
@click-add-field="handleClickAddField"
/>
</div>
<div
class="col"
>
<h4>FIELD VALUES:</h4>
<hr>
<div
v-for="(field, i) in formFields"
:key="i"
>{{ field.label }}: {{ field.value }}</div>
</div>
</div>
`,
})
.container {
display: flex;
}
.col {
padding: 0 8px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app"></div>
您可以看到,ADD
我刚刚在模板中添加了一个新项目formFields
- 值在模板中绑定到一个子组件,该子组件处理字段的实际表示。
在片段的右侧,您可以看到将数据与 UI 解耦的另一个好处:我创建了同一数据源的另一个表示 - 立即对任何更改做出反应!
推荐阅读
- python - 从 C++ 调用 Python,如何链接特定的 Anaconda 环境?
- json - jq 使用流解析 json 文件 > 20 gb
- python - 无法导入 Django,上周工作
- python - Python Matplotlib:在基本图上查找给定 y 值的相应 x 值
- tsql - sql server中PRINT @@ROWCOUNT和OUTPUT $ACTION的区别
- python - 如何将 Flask 后端应用程序连接到 Flask 前端应用程序?
- python - pytest 带有可选参数的行为很奇怪
- javascript - 在 JavaScript / TypeScript 文件中使用 [hash:base64:5]
- php - 显示具有某些条件的数据库字段
- typescript - Angular8 材质,带有标题和瓷砖的网格。mat-grid-tile 内容未完全调整大小