I'm used to creating controlled components in react using state; however, I'm new to Vue
and would like to learn how I could recreate my code from react into something Vue could use. I want the input fields values to be store in a piece of data so that I could do something with them.
// TextInput.vue
<template>
<div class="col-md-6">
<div class="form-group">
<input :value="value" @input="handleChange" ... >
<label for="name">Name <sub*</sub></label>
</div>
</div>
</template>
<script>
export default {
props: {
value: {
required: true,
type: String,
}
},
methods: {
handleChange(e) {
this.$emit('handleChange', e.target.value);
}
}
}
</script>
// Form.vue
<template>
/* ... */
<text-input :value="value" @handleChange="handleChange($event)">
/* ... */
</template>
<script>
export default {
data() {
return {
value: '',
}
},
methods: {
handleChange(payload) {
this.value = payload;
}
}
}
</script>
This is how it would look like in
Vue
这就是我可能会在Vue中编写相同组件的方式:
The form controls' state is stored on the
data
property of the component, and a two-way binding is set up on the controls with thev-model
directive. Any changes to the inputs will be synced to the component's state, and vice versa.Vue provides some handy modifiers when adding event listeners to the template, so by writing
@submit.prevent
the default submit handler is prevented from firing.I've created a sandbox example, so you can easily play around with the code and see it in action.