【问题标题】:Vue directive to access the Vue instance?Vue 指令访问 Vue 实例?
【发布时间】:2017-08-22 05:25:02
【问题描述】:

如何从指令中访问 Vue 实例?

我有这个 HTML

<div id='vueApp' v-init='my initial data from server-side'>

还有这个脚本

var app = new Vue({
    el: '#vueApp',
    data: {
        myData: null
    }
});

Vue.directive('init', function(el, binding) {
    app.myData = binding.value;
});

它会抛出这个错误:

无法解析指令:init

【问题讨论】:

    标签: vue.js


    【解决方案1】:

    您的特定错误是因为该指令是在 Vue 之后创建的。

    对于这个特定指令,您可以通过vnode.context 访问 Vue。

    Vue.directive('init', {
      bind(el, binding, vnode){
        vnode.context.myData = binding.expression;
      }
    });
    
    const app = new Vue({
        el: '#vueApp',
        data: {
            myData: null
        }
    });
    

    Example.

    您也可以考虑使用vnode.context.$root

    发表评论编辑

    你也可以这样做:

    const initialData = {
        someData: "Hello Vue!"
    };
    
    const app = new Vue({
        el: '#vueApp',
        data: {
            myData: intialData
        }
    });
    

    【讨论】:

    • 谢谢!这有效,但现在我无法修改 myData。我还收到“[Vue 警告]:您可能在组件渲染函数中有无限更新循环。”我应该使用 jfadich 说的道具吗?
    • @Aximili 我们可能可以解决这些问题(例如使用 Vue.set 而不是直接将其设置为相等),但我会说这是初始化 Vue 的一种不寻常的方式。您可能会考虑的只是data: { myData: &lt;your data&gt;}。我用一个例子编辑了答案。
    • @Aximili 以供将来参考,我更正了指​​令,因此您不会收到警告。
    • 感谢伯特·埃文斯。我需要将值放在 HTML 中,因为它来自服务器端。这样做的原因是在第一次加载页面时保存不必要的 AJAX 调用。
    • @Aximili 不客气。值得一提的是,大多数服务器端框架都允许您在脚本标签内渲染 JSON,因此您应该能够将初始数据渲染到脚本以及属性。
    猜你喜欢
    • 2018-06-13
    • 2019-10-28
    • 2019-02-27
    • 1970-01-01
    • 2019-04-02
    • 2020-05-28
    • 2021-08-25
    • 2019-04-04
    • 2018-09-08
    相关资源
    最近更新 更多