Vue JS - 如何用基于变量数据的模型创建动态输入字段?

问题描述 投票:0回答:1

我有一个Vue组件,它根据API获取的数据创建了一些输入。我将JSON中的值通过一个方法运行,如果某个条件匹配,该方法就会将该值转换为一个输入字段。下面是我的组件的样子。

<template>
    <div>
        <div v-for="(val, index) in data">
            <span>{{val.key}}</span>
            <span :inner-html.prop="checkForEdit(val)"></span>
        </div>
        <b-button @click="submitData">Save</b-button>
    <div>
</template>

export default {
    name: "SomeComp",
    data() {
        return {
            dynamicVars: {}
        }
    },
    methods: {
        ...mapActions("api", ["getData"]),
        checkForEdit(value) {
            if(!value) return '';
            if(value.mustEdit) {
                this.dynamicVars[value.key] = '';
                return '<input type="text" value= "'+ value.text +'" :model='+ this.dynamicVars[value.key]+'>';
            } else {
                return value.text;
            }
        },
        submitData() {
            console.log(this.dynamicVars); //Only the key is present, no value updated
        }
    },
    created() {
        this.getData();
    },
    computed: {
        ...mapState("api", ["data"]),
    }
};

这是数据的样子

[
    {key: 'name', text: 'John', mustEdit: false},
    {key: 'age', text: '100', mustEdit: true}
]

这些数据可以是任何东西,字段不是固定的,只有格式是固定的。所以我想在飞行中创建动态的vars对象,发送到保存它的API。

现在它只在 dynamicVars 然而,当我改变字段值时,它似乎没有实际反应。

javascript vue.js vue-component templating v-model
1个回答
1
投票

innerHTML 对Vue模板、绑定和反应性没有任何头绪--如果你设置了 domNode.innerHTML = '<input v-model="variable">'; 浏览器将直接忽略属性 v-model 因为它不是一个标准的 HTML5 属性。

你需要改变你的思维模式,不要用命令式的方式思考,而是尝试用声明式的方式思考--只要在你的模板中写下你想做的事情,Vue就会为你施展魔法。我们有Vue为我们做事情,而不是用老式的jQuery风格写代码,真是太幸运了。

<template>
    <div>
        <div v-for="(val, index) in data" :key="index">
            <label :for="'input_' + index">{{val.key}}</label>
            <input v-if="val.mustEdit" :id="'input_' + index" :model='val.text'>
            <span v-else>{{ val.text }}</span>
        </div>
        <b-button @click="submitData">Save</b-button>
    <div>
</template>

export default {
    name: "SomeComp",
    methods: {
        ...mapActions("api", ["getData"]),
        submitData() {
            console.log(this.data);
        }
    },
    created() {
        this.getData();
    },
    computed: {
        ...mapState("api", ["data"]),
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.