Как я могу указать связывающий контекст в Vue.js так же, как в knockout.js и WPF
Мы используем Vue.js, очень хороший фреймворк, если вы спросите меня. Из Knockout.js и WPF я знаю, что для привязок можно указать контекст. Как это можно сделать с помощью Vue.js?
Смотрите пример ниже. Вот binding-context
псевдокод для функциональности, которую я ищу в Vue.
Vue.component('hosting-setup', {
template:
'<wizard>' +
'<wizard-step binding-context="step1" :title="title">' +
'<select :options="choices"></select>' +
'</wizard-step>' +
'<wizard-step binding-context="step2" :title="title">' +
'<select :options="choices"></select>' +
'</wizard-step>' +
'</wizard>',
data: function () {
return {
step1: {
title: 'Choose virtualization software',
choices: ['Virtual Box', 'VMWare'],
choice: undefined,
},
step2: {
title: 'Choose guest operating system',
choices: ['Debian 6', 'Ubuntu 16', 'Windows Server 2012'],
choice: undefined
}
};
}
});
2 ответа
Не существует обязательного эквивалента "с" в Vue
, Есть несколько подходов к тому, что вы хотите сделать, но для вашего примера я бы использовал computed
вернуть ваши данные в виде массива, а затем использовать v-for
распечатать каждый компонент, пропуская соответствующие данные в виде реквизита:
Vue Instance
Vue.component('wizard-step', {
template: `<div>{{title}}</div>`,
props: ['title']
});
new Vue({
el: '#app',
computed: {
wizardSteps() {
return [this.step1, this.Step2]
}
},
data() {
return {
step1: {
title: 'Choose virtualization software',
choices: ['Virtual Box', 'VMWare'],
choice: undefined,
},
Step2: {
title: 'Choose guest operating system',
choices: ['Debian 6', 'Ubuntu 16', 'Windows Server 2012'],
choice: undefined
}
};
}
})
наценка
<wizard-step :title="step.title" v-for="(step, index) in wizardSteps" :key="index"></wizard-step>
Вот JSFiddle: http://jsfiddle.net/craig_h_411/vzq25go5/
РЕДАКТИРОВАТЬ
Если вы хотите передать данные непосредственно компоненту, вы можете использовать v-bind
передать объект и объявить имена свойств объекта, которые вы хотите использовать в компоненте, как props
что, возможно, становится ближе к тому, что вы просите, так:
Vue.component('wizard-step', {
template: `<div>
{{title}}
<select>
<option v-for="choice in choices" >{{choice}}</option>
</select>
</div>`,
props: ['title','choices']
});
Родительская разметка
<wizard-step v-bind="step1"></wizard-step>
<wizard-step v-bind="Step2"></wizard-step>
Вот для этого JSFiddle: http://jsfiddle.net/craig_h_411/7dg41j0w/
Если у вас действительно вложенный ребенок, попробуйте обмануть, используя v-for с массивом из 1 элемента.
<template v-for="local in [data.nest1.nest2.nest3]">
//normal binding using local.XXXX
</template>
Протестировано в Vue 2.6.10:
<template>
<wizard>
<wizard-step v-if="props.step1 ? step = props.step1 : false" :title="step.title">
<select :options="step.choices"></select>
</wizard-step>
<wizard-step v-if="props.step2 ? step = props.step2 : false" :title="step.title">
<select :options="step.choices"></select>
</wizard-step>
</wizard>
</template>
ПРИМЕЧАНИЕ. Еще лучше, для более краткого кода вы можете создать подкомпонент только для и передать заголовок и параметры:
Т.е.
<template>
<wizard>
<wizard-step v-if="props.step1" :step="props.step1" />
<wizard-step v-if="props.step2" :step="props.step2" />
</wizard>
</template>
и ваш ребенок-мастер-шаг будет:
<template>
<wizard-step :title="step.title">
<select :options="step.choices"></select>
</wizard-step>
</template>
И еще одно улучшение: если вы контролируете структуру возвращаемых данных, вы можете вернуть массив steps
(вместо step1 и step2), и вы можете еще больше упростить с помощью for-each:
<template>
<wizard>
<wizard-step v-for="step in props.data" :step="step" />
</wizard>
</template>