【发布时间】:2018-07-26 13:46:08
【问题描述】:
是否可以在 DOM 中位于 Vue 实例根元素之外的元素上使用 v-model?
即,您能否提供以下内容:
$(function(){
Vue.component('custom-element', {
template: '#custom-template'
})
var vm = new Vue({
el: "#app"
data: {
selected: ""
}
})
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script>
<select id="SportSelector" v-model="selected">
<option value="football"> Football </option>
<option value="tennis"> Tennis </option>
</select>
<div id="app">
<custom-element>
</custom-element>
</div>
<script type="text/x-template" id="custom-template">
<div>
<p> {{selected}} </p>
</div>
</script>
选择在 Vue 的根元素(“app”)之外的地方。这是我的问题的简化版本,但我相信突出了我遇到的困难。
我看到这个答案在谈论 centralised state management 在 Vue 之间共享数据,但是必须将选择包装在一个完全不同的 Vue 中似乎有点繁重,我觉得我错过了一些重要的东西! (对于 Vue 来说还是很新的)。 Vue 与之交互的所有内容都必须位于 Vue 实例的根元素下吗?
【问题讨论】:
-
您可以在根元素内创建一个不可见/空的自定义组件,该组件将控制它之外的元素。但仅出于可维护性的原因,不应该这样做。是的,Vue 或类似库的工作方式,由库控制的所有内容都应该在一个 Vue 实例中。
-
为什么你的应用程序根目录之外有东西?理想情况下,您提供给 Vue 的元素会包裹您的整个页面。将
<select>置于 Vue 控制之外的目的是什么? -
可以在 Vue 外根据 select 设置 Vue 数据值,但不能在 select 上使用
v-model。此外,我完全不同意 Vue 需要始终包裹整个页面的上述评论。 Vue 的一大优势在于它很容易集成到现有页面中。 -
@Bert 我们至少可以同意它应该包装任何你想做的反应数据绑定吗?这是一个 XY 问题。 OP 说“在 Vue 之间共享数据”,对我来说,这意味着 OP 正在让一个 Vue 上下文尝试进入另一个 Vue 上下文,这似乎是个坏主意。
-
@zero298 在我看来,OP 并没有试图在 Vues 之间共享数据,而是有利于使用状态管理系统,他接着说他真的不想把选择放在另一个 Vue 中。在很多情况下,例如使用 CMS,其中一些布局并不完全在您的控制之下,但您仍然可能希望对 UI 的某些元素使用 Vue。
标签: javascript vue.js vuejs2