在自定义组件上使用 v-model
Using v-model on custom component
当我开始在输入字段中键入内容时,我想在控制台中获取此数据,但目前它是空的。我做错了什么?
HTML:
<products-list v-model="product.name" v-on:keyup="productName"></products-list>
JS:
Vue.component('products-list', {
template:
`<input class="product_name form-control" contenteditable="true"></input>`,
});
var app = new Vue({
el: '#app',
data: {
items: items,
product: {
name: "",
}
},
methods: {
productName: function() {
console.log(product.name);
}
}
});
v-model
默认使用 @input
事件,所以如果你想在自定义组件上使用 v-model
你需要将输入事件发送到 parent .因此,在您的组件中,您只需执行以下操作:
<input class="product_name form-control" @input="$emit('input', $event.target.value)" />
现在在您的 parent 中您可以:
<products-list v-model="product.name"></products-list>
您可以在这个 JSFiddle 上看到完整的示例:https://jsfiddle.net/7s2ugt11/
Using v-model
in custom components sometimes will lead us to some conflicts.
或者我们只是想将该值用于不同的目的。
所以vue引入了model。请看一下。
<!-- Parent Component -->
<div id="app">
<my-checkbox v-model="checked" value="unchanged"></my-checkbox>{{checked}}
</div>
<!-- Child Component -->
<template id="my_checkbox">
<div>
My value is {{value}} <br>
<input type="checkbox" :value="value" @change="$emit('change', !checked)">
</div>
</template>
和脚本:
Vue.component('my-checkbox', {
template: '#my_checkbox',
model: {
prop: 'checked',
event: 'change'
},
props: {
// this allows using the `value` prop for a different purpose
value: String,
// use `checked` as the prop which take the place of `value`
checked: {
type: Boolean,
default: false
}
},
})
new Vue({
el: "#app",
data: {
checked: null
},
})
Vue 有重大变化 3.x:
BREAKING: When used on custom components, v-model
prop and event default names are changed:
prop: value
-> modelValue
event: input
-> update:modelValue
https://v3.vuejs.org/guide/migration/v-model.html
因此您的子组件将是:
<template>
<input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" />
</template>
<script>
export default {
name: "ProductsList",
props: ['modelValue']
}
</script>
并且在父组件中你不会改变任何东西:
<products-list v-model="product.name"></products-list>
当我开始在输入字段中键入内容时,我想在控制台中获取此数据,但目前它是空的。我做错了什么?
HTML:
<products-list v-model="product.name" v-on:keyup="productName"></products-list>
JS:
Vue.component('products-list', {
template:
`<input class="product_name form-control" contenteditable="true"></input>`,
});
var app = new Vue({
el: '#app',
data: {
items: items,
product: {
name: "",
}
},
methods: {
productName: function() {
console.log(product.name);
}
}
});
v-model
默认使用 @input
事件,所以如果你想在自定义组件上使用 v-model
你需要将输入事件发送到 parent .因此,在您的组件中,您只需执行以下操作:
<input class="product_name form-control" @input="$emit('input', $event.target.value)" />
现在在您的 parent 中您可以:
<products-list v-model="product.name"></products-list>
您可以在这个 JSFiddle 上看到完整的示例:https://jsfiddle.net/7s2ugt11/
Using
v-model
in custom components sometimes will lead us to some conflicts.
或者我们只是想将该值用于不同的目的。
所以vue引入了model。请看一下。
<!-- Parent Component -->
<div id="app">
<my-checkbox v-model="checked" value="unchanged"></my-checkbox>{{checked}}
</div>
<!-- Child Component -->
<template id="my_checkbox">
<div>
My value is {{value}} <br>
<input type="checkbox" :value="value" @change="$emit('change', !checked)">
</div>
</template>
和脚本:
Vue.component('my-checkbox', {
template: '#my_checkbox',
model: {
prop: 'checked',
event: 'change'
},
props: {
// this allows using the `value` prop for a different purpose
value: String,
// use `checked` as the prop which take the place of `value`
checked: {
type: Boolean,
default: false
}
},
})
new Vue({
el: "#app",
data: {
checked: null
},
})
Vue 有重大变化 3.x:
BREAKING: When used on custom components,
v-model
prop and event default names are changed:
prop:value
->modelValue
event:input
->update:modelValue
https://v3.vuejs.org/guide/migration/v-model.html
因此您的子组件将是:
<template>
<input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" />
</template>
<script>
export default {
name: "ProductsList",
props: ['modelValue']
}
</script>
并且在父组件中你不会改变任何东西:
<products-list v-model="product.name"></products-list>