【问题标题】:Is there a way to initialize a Vue object preserving initial HTML有没有办法初始化一个保留初始 HTML 的 Vue 对象
【发布时间】:2015-02-20 20:51:08
【问题描述】:

我想使用 Vue.js 来更轻松地操作 DOM,但是当我初始化一个 Vue 对象时,它会在操作之前重写最初由后端生成的初始数据。

例如我有这个标记:

<ul id="list">
  <li v-repeat="elements" v-text="content">a</li>
  <li v-repeat="elements" v-text="content">b</li>
  <li v-repeat="elements" v-text="content">c</li>
</ul>

然后我想使用new Vue({ el: '#list' }),以便在通过编辑$data 进行操作之前以某种方式读取已经存在的标记并保留它。这是否可以实现?

【问题讨论】:

    标签: javascript html dom mvvm vue.js


    【解决方案1】:

    我认为这不可能按照您想要的方式进行。 Vue.JS 不直接对 DOM 进行操作。它读取 DOM 元素,将它们转换为渲染函数,并用渲染函数的结果替换整个元素。

    您可能应该使用 JQuery 扫描您的 DOM 并填充您的 $data 对象(可能还有您的 Vue 模板字符串),然后使用生成的数据初始化您的 Vue 实例。

    但总的来说 - 你应该重新考虑你的应用程序逻辑,因为你似乎在做一些非常复杂的事情,这可能会更容易解决。无论生成什么你的 DOM-Template 都可能直接渲染成一个 JS 变量,甚至可以通过 AJAX 调用来访问......

    如果您想在客户端不支持 JS 或 Vue 的 CDN 不可用时呈现回退方法,您可以使用脚本模板方法。在脚本标签中定义你的 Vue.JS 内容,当 Vue 准备好时,它将替换原始 DOM。

    例子:

    function loadVue() {
      new Vue({
        data: { values: [ 'aaa','bbb','ccc' ] },
        template: '#list-template',
        el: '#list'
      })
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.4/vue.js"></script>
    
    <ul id="list">
      <li>a</li>
      <li>b</li>
      <li>c</li>
      <button onclick="loadVue()">Load Vue.JS</button>
    </ul>
    
    <script type="text/x-template" id="list-template">
    <ul id="list">
      <li v-for="v in values">{{v}}</li>
    </ul>
    </script>

    【讨论】:

    • 我只是在想我是否真的可以让它不引人注目。说 js 被禁用,但我仍然有一个预先初始化的列表。
    • @German 我添加了一个示例,如何在没有您描述的 JS/Vue 问题的情况下解决替代内容。
    【解决方案2】:

    没有理由不能像这样使用现有元素和v-repeat 的组合

    new Vue({
        el: '#list',
        data: {
            elements: [{
                content: "d (v-repeat)"
            }, {
                content: "e (v-repeat)"
            }, {
                content: "f (v-repeat)"
            }]
        }
    });
    <script src="http://cdnjs.cloudflare.com/ajax/libs/vue/0.11.4/vue.min.js"></script>
    <ul id="list">
        <li>a</li>
        <li>b</li>
        <li>c</li>
        <li v-repeat="elements" v-text="content">c</li>
    </ul>
    您只是不要将v-repeat 放在已经存在的元素上。

    【讨论】:

    • 但是这样 a、b 和 c 不能通过 Vue 访问。我无法删除它们或更改它们的内容。任务是预加载初始数据,而不仅仅是添加其他不受影响的标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2013-07-20
    • 2015-03-22
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多