我有一个带有Bootstrap Vue中的b-form-select控件的页面。 当我更改此控件的值时,我想执行一个可以取消此事件且不更改值的函数。
为了使事情变得更复杂,我的选择位于子组件中,而我执行的功能位于父组件中。
子组件
public values: any[] = [
{ name: 'default'},
{ name: 'forbidden'},
{ name: 'other option' },
]
<b-form-select :value="property" @change="$emit('onPropertyChange', arguments[0])">
<option v-for="(val, key) in values" :value="val" :key="key">{{val.Name}}</option>
</b-form-select>
父组件:
this.property = { name: 'default' }
public onPropertyChange(newValue) {
if (newValue.name === 'forbidden') {
// Not changing this.property
} else {
// Changing it
this.property = newValue
}
}
<child :property="property" @onPropertyChange="onPropertyChange"></child>
当我在选择中选择“禁止”时。我看到选择框已更改为该值,但是子级属性和父级属性仍然具有旧值,这正是我想要的。我该如何选择旧值呢?
Bootstrap Vue在change事件上似乎没有prevent修饰符。 我也尝试使用本机事件,但是存在相同的问题。
我做错什么了吗?
答案 0 :(得分:1)
禁用禁止的选项可能比使它们神秘地不选择选定的值更好,但是可以通过保存旧值并将其恢复到{{3} }。
请注意,您的options
结构不适用于b-form-select
。我进行了计算,可以制作正确的结构并处理设置disabled
,并将其用于b-form-select
。
new Vue({
el: '#app',
data: {
selected: 'default',
options: [{
name: 'default',
},
{
name: 'forbidden'
},
{
name: 'other option'
},
{
name: 'what I had before'
},
]
},
computed: {
selectOptions() {
return this.options.map((opt) => ({
text: opt.name,
value: opt.name,
disabled: opt.name === 'forbidden'
}));
}
},
methods: {
onChange(newValue) {
const oldValue = this.selected;
if (newValue === 'what I had before') {
this.$nextTick(() => {
this.selected = oldValue;
});
}
}
}
});
<script src="https://unpkg.com/vue@latest/dist/vue.js"></script>
<script src="https://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>
<div id="app">
<b-form-select v-model="selected" :options="selectOptions" @change="onChange">
</b-form-select>
<div>Selected: <strong>{{selected}}</strong></div>
</div>