gpt4 book ai didi

input - 带有 v-model 的 Vue.js 组件

转载 作者:行者123 更新时间:2023-12-01 06:58:00 24 4
gpt4 key购买 nike

我已经能够在自定义组件上完成单层深度的 v-model 双向绑定(bind),但需要更深一层。

当前工作代码:

    <template lang="html">

<div class="email-edit">

<input ref="email" :value="value.email" @input="updateInput()"/>
<input ref="body" :value="value.body" @input="updateInput()"/>

</div>

</template>
<script type="text/javascript">
import LineEditor from './LineEditor.vue'
export default {
components: {
LineEditor
},
computed: {
},
methods: {
updateInput: function(){
this.$emit('input',{
email: this.$refs.email.value,
body: this.$refs.body.value
})
}
},
data: function(){
return {}
},
props: {
value: {
default: {
email: "",
body: ""
},
type:Object
}
}
}
</script>

这样使用:<email-edit-input v-model="emailModel" />

但是,如果我添加这 block ,值将不再向上传播:

      <div class="email-edit">

<line-editor ref="email" :title="'Email'" :value="value.email" @input="updateInput()"/>
<input ref="body" :value="value.body" @input="updateInput()"/>

</div>

</template>
<script type="text/javascript">
import LineEditor from './LineEditor.vue'
export default {
components: {
LineEditor
},
computed: {
},
methods: {
updateInput: function(){
this.$emit('input',{
email: this.$refs.email.value,
body: this.$refs.body.value
})
}
},
data: function(){
return {}
},
props: {
value: {
default: {
email: "",
body: ""
},
type:Object
}
}
}
</script>

使用第二个自定义组件:

<template lang="html">

<div class="line-edit">
<div class="line-edit__title">{{title}}</div>
<input class="line-edit__input" ref="textInput" type="text" :value="value" @input="updateInput()" />
</div>

</template>
<script type="text/javascript">
export default {
components: {
},
computed: {
},
methods: {
updateInput: function(){
this.$emit('input', this.$refs.textInput.value)
}
},
data: function(){
return {}
},
props: {
title:{
default:"",
type:String
},
value: {
default: "",
type: String
}
}
}
</script>

第一个代码块只需要一个输入就可以正常工作。然而,使用两个自定义组件似乎并没有通过这两个组件冒泡,只有 LineEditor。无论嵌套如何,如何让这些值在所有自定义组件中冒泡?

最佳答案

我已经稍微更新了您的代码以处理在您的组件上使用 v-model 的问题,这样您就可以将值向下传递到树中并备份到树中。我还在您的组件中添加了观察者,这样如果您应该从电子邮件编辑器组件外部更新电子邮件对象值,更新将反射(reflect)在该组件中。

console.clear()

const LineEditor = {
template:`
<div class="line-edit">
<div class="line-edit__title">{{title}}</div>
<input class="line-edit__input" type="text" v-model="email" @input="$emit('input',email)" />
</div>
`,
watch:{
value(newValue){
this.email = newValue
}
},
data: function(){
return {
email: this.value
}
},
props: {
title:{
default:"",
type:String
},
value: {
default: "",
type: String
}
}
}

const EmailEditor = {
components: {
LineEditor
},
template:`
<div class="email-edit">
<line-editor :title="'Email'" v-model="email" @input="updateInput"/>
<input :value="value.body" v-model="body" @input="updateInput"/>
</div>
`,
watch:{
value(newValue){console.log(newValue)
this.email = newValue.email
this.body = newValue.body
}
},
methods: {
updateInput: function(value){
this.$emit('input', {
email: this.email,
body: this.body
})
},
},
data: function(){
return {
email: this.value.email,
body: this.value.body
}
},
props: {
value: {
default: {
email: "",
body: ""
},
type: Object
}
}
}

new Vue({
el:"#app",
data:{
email: {}
},
components:{
EmailEditor
}
})
<script src="https://unpkg.com/vue@2.2.6/dist/vue.js"></script>
<div id="app">
<email-editor v-model="email"></email-editor>
<div>
{{email}}
</div>
<button @click="email={email:'testing@email', body: 'testing body' }">change</button>
</div>

在上面的示例中,在输入中输入值会更新父级。此外,我添加了一个更改父级值的按钮,以模拟组件外部的值变化以及组件中反射(reflect)的变化。

没有真正的理由为这段代码使用 ref

关于input - 带有 v-model 的 Vue.js 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44506200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com