使用 _uid 和迭代
Using _uid and Iteration
我正在尝试根据数据数组迭代并选中一些框。我尝试这样做的方式(使用 _uid
)似乎没有用。
JS:
//The second checkbox will be checked by default
var build = [true, true, false]
let enhancements = [
{
name: "Action One"
},
{
name: "Action Two"
},
{
name: "Action Three"
}
]
Vue.component('cleanse-checkbox', {
props: ['enhancement'],
data() {
return {
isSelected: 'action-point-on',
notSelected: 'action-point-off',
build: build[this._uid-1]
};
},
template: `
<div class="mb-2">
<p>{{ build }}</p>
<button :class="[isActive ? isSelected : notSelected, notSelected]"
v-on:click="toggleEnhancement">{{ enhancement.name }}</button>
</div>
`,
computed: {
isActive: function () {
return this.build;
}
},
methods: {
toggleEnhancement: function() {
this.build = this.build == 0;
this.$emit('toggle-enhancement', [this._uid-1, this.build])
}
}
});
var app = new Vue({
el: '#app',
delimiters: ['${', '}'],
data: {
build: build,
enhancements: enhancements
},
methods: {
updateEnhancement: function (value) {
this.build[value[0]] = value[1]
}
}
});
HTML
<div id="app">
<p>${ build }</p>
<cleanse-checkbox v-for="enhancement in enhancements"
:enhancement="enhancement"
v-on:toggle-enhancement="updateEnhancement"> </cleanse-checkbox>
</div>
是否有合适的 'vue' 方法来完成这样的事情?还是我使用不正确的语法在正确的轨道上?这是 fiddle:https://jsfiddle.net/wb37t84j/
您在 Vue 中遇到了“gotcha”。 Vue 无法检测到您在此行所做的更改。
this.build[value[0]] = value[1]
此外,我会避免使用 _uid
。这是您的代码的一个版本。
let build = [true, true, false]
let enhancements = [
{
name: "Action One"
},
{
name: "Action Two"
},
{
name: "Action Three"
}
]
Vue.component('cleanse-checkbox', {
props: ['enhancement', 'build'],
data() {
return {
isSelected: 'action-point-on',
notSelected: 'action-point-off',
internalBuild: this.build
};
},
template: `
<div class="mb-2">
<p>{{ build }}</p>
<button :class="[isActive ? isSelected : notSelected, notSelected]"
v-on:click="toggleEnhancement">{{ enhancement.name }}</button>
</div>
`,
computed: {
isActive: function () {
return this.internalBuild;
}
},
methods: {
toggleEnhancement: function() {
this.internalBuild = !this.internalBuild
this.$emit('toggle-enhancement', this.enhancement, this.internalBuild)
}
}
});
var app = new Vue({
el: '#app',
delimiters: ['${', '}'],
data: {
build: build,
enhancements: enhancements
},
methods: {
updateEnhancement: function (enhancement, build) {
Vue.set(this.build, this.enhancements.indexOf(enhancement), build)
}
}
});
这是修改后的模板
<div id="app">
<p>${ build }</p>
<cleanse-checkbox v-for="(enhancement, index) in enhancements"
:enhancement="enhancement"
:build="build[index]"
v-on:toggle-enhancement="updateEnhancement">
</cleanse-checkbox>
</div>
我正在尝试根据数据数组迭代并选中一些框。我尝试这样做的方式(使用 _uid
)似乎没有用。
JS:
//The second checkbox will be checked by default
var build = [true, true, false]
let enhancements = [
{
name: "Action One"
},
{
name: "Action Two"
},
{
name: "Action Three"
}
]
Vue.component('cleanse-checkbox', {
props: ['enhancement'],
data() {
return {
isSelected: 'action-point-on',
notSelected: 'action-point-off',
build: build[this._uid-1]
};
},
template: `
<div class="mb-2">
<p>{{ build }}</p>
<button :class="[isActive ? isSelected : notSelected, notSelected]"
v-on:click="toggleEnhancement">{{ enhancement.name }}</button>
</div>
`,
computed: {
isActive: function () {
return this.build;
}
},
methods: {
toggleEnhancement: function() {
this.build = this.build == 0;
this.$emit('toggle-enhancement', [this._uid-1, this.build])
}
}
});
var app = new Vue({
el: '#app',
delimiters: ['${', '}'],
data: {
build: build,
enhancements: enhancements
},
methods: {
updateEnhancement: function (value) {
this.build[value[0]] = value[1]
}
}
});
HTML
<div id="app">
<p>${ build }</p>
<cleanse-checkbox v-for="enhancement in enhancements"
:enhancement="enhancement"
v-on:toggle-enhancement="updateEnhancement"> </cleanse-checkbox>
</div>
是否有合适的 'vue' 方法来完成这样的事情?还是我使用不正确的语法在正确的轨道上?这是 fiddle:https://jsfiddle.net/wb37t84j/
您在 Vue 中遇到了“gotcha”。 Vue 无法检测到您在此行所做的更改。
this.build[value[0]] = value[1]
此外,我会避免使用 _uid
。这是您的代码的一个版本。
let build = [true, true, false]
let enhancements = [
{
name: "Action One"
},
{
name: "Action Two"
},
{
name: "Action Three"
}
]
Vue.component('cleanse-checkbox', {
props: ['enhancement', 'build'],
data() {
return {
isSelected: 'action-point-on',
notSelected: 'action-point-off',
internalBuild: this.build
};
},
template: `
<div class="mb-2">
<p>{{ build }}</p>
<button :class="[isActive ? isSelected : notSelected, notSelected]"
v-on:click="toggleEnhancement">{{ enhancement.name }}</button>
</div>
`,
computed: {
isActive: function () {
return this.internalBuild;
}
},
methods: {
toggleEnhancement: function() {
this.internalBuild = !this.internalBuild
this.$emit('toggle-enhancement', this.enhancement, this.internalBuild)
}
}
});
var app = new Vue({
el: '#app',
delimiters: ['${', '}'],
data: {
build: build,
enhancements: enhancements
},
methods: {
updateEnhancement: function (enhancement, build) {
Vue.set(this.build, this.enhancements.indexOf(enhancement), build)
}
}
});
这是修改后的模板
<div id="app">
<p>${ build }</p>
<cleanse-checkbox v-for="(enhancement, index) in enhancements"
:enhancement="enhancement"
:build="build[index]"
v-on:toggle-enhancement="updateEnhancement">
</cleanse-checkbox>
</div>