如何在 none form-related 元素上使用 v-model?
How do I use v-model on none form-related elements?
首先,我在 my-component
中使用 Vuetify 的 VSwitch
组件。我想把return的值my-component
改成parent.
类似于<my-component v-model="returnedData"></my-component>
然后里面<my-component></my-component>
<template>
<div>
<v-switch v-model="toggledData" value="John"></v-switch>
<v-switch v-model="toggledData" value="Andrew"></v-switch>
<v-switch v-model="toggledData" value="Melissa"></v-switch>
<v-switch v-model="toggledData" value="Elizabeth"></v-switch>
</div>
</template>
<script>
export default {
props: ['value'],
data () {
return {
toggledData: []
}
}
}
</script>
我想 return toggledData
的值到正在使用它的 parent 如果可能的话。我已经浏览了一段时间的网络,但我只看到了输入。但是 Vuetify 的一些组件是可能的,比如 VTreeview
所以我在想也许这是可能的。
你可以这样做:
<v-switch @change="$emit('swithValue', value)" value="John"></v-switch>
然后在你的父组件中只听 swithcValue
就像 @switchValue="myFunction"
你的函数隐式地获取发出的值,你可以随心所欲地处理它。
像你的例子一样使用v-model
:
<my-component v-model="returnedData"></my-component>
(默认情况下)等同于:
<my-component :value="returnedData" @input="returnedData = $event"></my-component>
任何组件都可以支持 v-model
,只需拥有 value
属性并发出 input
事件。可以使用 model
选项更改道具和事件的名称,请参阅 https://vuejs.org/v2/guide/components-custom-events.html#Customizing-Component-v-model
所有这些都假定您需要 two-way 数据绑定。在您的问题中,您似乎暗示您只想将数据传递给父级,这只是一种方式。为此,您只需要发出一个事件并使用 @
侦听器侦听该事件。
真正创建 two-way 数据绑定在这种情况下会很棘手。最简单的方法是将 v-model
放在 v-switch
上,然后分别使用道具和事件。有替代方案,例如将 v-model
与具有 getter 和 setter 的计算 属性 一起使用,但我不相信这会使事情变得更清楚。
父组件用childToParent
监听子组件的变化,如果有任何变化我调用childChanged ()
方法
// Parent Component
<template>
<div id="parent">
<p>{{parentToggledData}}</p>
<Child v-on:childToParent="childChanged"/>
</div>
</template>
<script>
import Child from "./Child";
export default {
name: "parent",
components: {
Child
},
data() {
return {
parentToggledData: []
};
},
methods: {
childChanged(value) {
this.parentToggledData = value;
}
}
};
</script>
我监听每个 v-switch
的变化,如果有一个,我在这个方法中调用 emitToParent ()
方法,我用 $emit
将变化发送给父级它将父 childToParent
监听的事件和“要发送的值 this.toggledData
作为参数
// Child Component
<template>
<div id="child">
<v-switch v-model="toggledData" value="John" @change="emitToParent"></v-switch>
<v-switch v-model="toggledData" value="Andrew" @change="emitToParent"></v-switch>
<v-switch v-model="toggledData" value="Melissa" @change="emitToParent"></v-switch>
<v-switch v-model="toggledData" value="Elizabeth" @change="emitToParent"></v-switch>
</div>
</template>
<script>
export default {
name: "child",
data() {
return {
toggledData: []
};
},
methods: {
emitToParent(event) {
console.log(event)
console.log(this.toggledData)
this.$emit("childToParent", this.toggledData);
}
}
};
</script>
首先,我在 my-component
中使用 Vuetify 的 VSwitch
组件。我想把return的值my-component
改成parent.
类似于<my-component v-model="returnedData"></my-component>
然后里面<my-component></my-component>
<template>
<div>
<v-switch v-model="toggledData" value="John"></v-switch>
<v-switch v-model="toggledData" value="Andrew"></v-switch>
<v-switch v-model="toggledData" value="Melissa"></v-switch>
<v-switch v-model="toggledData" value="Elizabeth"></v-switch>
</div>
</template>
<script>
export default {
props: ['value'],
data () {
return {
toggledData: []
}
}
}
</script>
我想 return toggledData
的值到正在使用它的 parent 如果可能的话。我已经浏览了一段时间的网络,但我只看到了输入。但是 Vuetify 的一些组件是可能的,比如 VTreeview
所以我在想也许这是可能的。
你可以这样做:
<v-switch @change="$emit('swithValue', value)" value="John"></v-switch>
然后在你的父组件中只听 swithcValue
就像 @switchValue="myFunction"
你的函数隐式地获取发出的值,你可以随心所欲地处理它。
像你的例子一样使用v-model
:
<my-component v-model="returnedData"></my-component>
(默认情况下)等同于:
<my-component :value="returnedData" @input="returnedData = $event"></my-component>
任何组件都可以支持 v-model
,只需拥有 value
属性并发出 input
事件。可以使用 model
选项更改道具和事件的名称,请参阅 https://vuejs.org/v2/guide/components-custom-events.html#Customizing-Component-v-model
所有这些都假定您需要 two-way 数据绑定。在您的问题中,您似乎暗示您只想将数据传递给父级,这只是一种方式。为此,您只需要发出一个事件并使用 @
侦听器侦听该事件。
真正创建 two-way 数据绑定在这种情况下会很棘手。最简单的方法是将 v-model
放在 v-switch
上,然后分别使用道具和事件。有替代方案,例如将 v-model
与具有 getter 和 setter 的计算 属性 一起使用,但我不相信这会使事情变得更清楚。
父组件用childToParent
监听子组件的变化,如果有任何变化我调用childChanged ()
方法
// Parent Component
<template>
<div id="parent">
<p>{{parentToggledData}}</p>
<Child v-on:childToParent="childChanged"/>
</div>
</template>
<script>
import Child from "./Child";
export default {
name: "parent",
components: {
Child
},
data() {
return {
parentToggledData: []
};
},
methods: {
childChanged(value) {
this.parentToggledData = value;
}
}
};
</script>
我监听每个 v-switch
的变化,如果有一个,我在这个方法中调用 emitToParent ()
方法,我用 $emit
将变化发送给父级它将父 childToParent
监听的事件和“要发送的值 this.toggledData
// Child Component
<template>
<div id="child">
<v-switch v-model="toggledData" value="John" @change="emitToParent"></v-switch>
<v-switch v-model="toggledData" value="Andrew" @change="emitToParent"></v-switch>
<v-switch v-model="toggledData" value="Melissa" @change="emitToParent"></v-switch>
<v-switch v-model="toggledData" value="Elizabeth" @change="emitToParent"></v-switch>
</div>
</template>
<script>
export default {
name: "child",
data() {
return {
toggledData: []
};
},
methods: {
emitToParent(event) {
console.log(event)
console.log(this.toggledData)
this.$emit("childToParent", this.toggledData);
}
}
};
</script>