我想要做傳入一個array 然後自動生成相關的input組件
這樣的話 我該如何定義變數去跟model綁定
用 ‵ ‵ 框起來的是我想將compobj.name的字串當變數的名稱
或是有其他 更好的動態生成的方式想法也可以提供嗎
謝謝
a.vue
compObj: [
{ name: "name", type: "text", label: t("name") },
{ name: "language", type: "select", label: t("language"), option: languageOption.value },
],
b.vue
<div class="component-div" v-for="comp in compObj" :key="comp.name">
<q-input v-if="comp.type == 'text'" v-model="`comp.name`" :label="comp.label" />
<q-select
v-if="comp.type == 'select'"
v-model="`comp.name`"
:options="comp.option"
:label="comp.label"
/>
</div>
<script setup>
const props = defineProps({
compObj: Object,
});
console.log(props.compObj);
const `props.compObj[0].name` = ref();
const `props.compObj[1].name` = ref();
</script>
基本上來說。JS要跟PHP一樣直接字串變數對應的做法是不太可能的。
你只能使用一個物件來繼承變數處理
let variables = {}; //準備字串變數用
let a = 'abc';
variables[a] = 'AAA';
console.log(variables,variables[a],variables['abc']);
另外的做法就是用函式物件的方式來處理。定義參數跟取得參數
const variables={};
set('abc','AAA');
let abc = get('abc');
functuin set(key,val){
variables[key] = val;
}
functiom get(key){
return variables[key];
}
提外話:
其實PHP中的「$」
本身就可以將其視為一種物件的存在。
這也是為何它能夠字串變數化處理。
但JS並不存在這樣的東西。
不過像是JQUERY的$及一些VUE的 t()
都有其相同的效果存在。
但就原生的JS來說。並不存在這樣的東西。
下午測試完 寫成用變數字串的方式
A.vue
compObj: [
{ name: "language", type: "selectInput", label: t("language"), option: languageOption.value },
{ name: "name", type: "text", label: t("name") },
{ name: "caption", type: "text", label: t("caption") },
{ name: "groups", type: "select", label: t("groups"), option: groupsOption.value },
],
B.vue
<div class="col-5 component-div" v-for="comp in compObj" :key="comp.name">
<q-input v-if="comp.type == 'text'" dense outlined v-model="variables[comp.name]" :label="comp.label" />
<q-select
v-if="comp.type == 'select'"
v-model="variables[comp.name]"
:options="comp.option"
:label="comp.label"
/>
</div>
const variables = utils.ref({});
Object.keys(props.compObj).forEach((index) => {
let varKey = props.compObj[index].name;
variables.value[varKey] = utils.ref("");
});
你的需求就是下面的用v-bind:is的動態組件而已...
@froce 我這個再研究看看
目前剛學幾個月 還在摸索中
我猜你是要 Dynamic Components
下面是一個範例
App.vue
<script>
import TextComponent from "./components/text-component.vue";
import SelectComponent from "./components/select-component.vue";
const pageComponents = [
{
comp: "TextComponent",
props: {
label: "文字輸入",
defaultVal: "測試文字"
}
},
{
comp: "SelectComponent",
props: {
label: "language",
defaultVal: "中文",
options: ["中文", "EN"],
}
}
];
export default {
data() {
return {
pageComponents
}
},
components: {
TextComponent,
SelectComponent,
}
}
</script>
<template>
<div v-for="comp in pageComponents">
<component :is="comp.comp" v-bind="comp.props"></component>
</div>
</template>
text-component.vue
<script>
let idCounter = 0;
export default {
props: ['label', 'defaultVal'],
data() {
return {
id: 'text-component-' + (++idCounter),
val: this.defaultVal
}
},
};
</script>
<template>
<label :for="id">{{ label }}</label><input type="text" v-model="val">
</template>
select-component.vue
<script>
let idCounter = 0;
export default {
props: ['label', 'defaultVal', 'options'],
data() {
return {
id: 'select-component-' + (++idCounter),
val: this.defaultVal,
}
}
};
</script>
<template>
<label :for="id">{{ label }}</label>
<select v-model="val">
<option v-for="opt in options">{{ opt }}</option>
</select>
</template>