【问题标题】:VueJS Accessing an "export default{ }" internally vs. a defined constant main appVueJS 在内部访问“导出默认值{}”与定义的常量主应用程序
【发布时间】:2018-03-29 04:03:32
【问题描述】:

我的主应用程序页面中有以下代码,如果您使用 VueJS(我开始使用),这可能很熟悉:

//written in ES6
const app = new Vue({
el: '#app',
data: function(){ return {
    query: {},
    requests: [],
    original: {},
    assignees: {},
    transiting: false,
    editing: false,
}},
created: function () {
    console.log(this.requests);   //this works
    console.log(app.requests);    //this also works
    this.doSomething('bar');
},
methods: {
    doSomething: function(arg){
        console.log('foo is a '+arg); //this works too
    }
}
});

但是,我的组件 JavaScript 看起来像这样。 created 正在运行——我已经检查过了——但我似乎无法以同样的方式访问我的数据和方法,主要是因为我不熟悉“导出默认值{ }”

export default {
    name: 'request-tracking-calendar',
    data: {
            events: [
                {
                    id: 10,
                    name: 'Boris',
                    ssn: '515860000',
                },
                {
                    id: 11,
                    name: 'Natasha',
                    ssn: '575860001',
                },
            ]
    },
    created: function(){
        console.log('Updating events dynamically..'); 
        {
            //code omitted for clarity
            var xhr = new XMLHttpRequest();
            // etc.
            xhr.onload = function(a) {
                if (xhr.status === 200) {
                    for (var i in xhr.response.data){
                    //DOESN'T work! not a function

      console.log(this.convertJSONToEvent(xhr.response.data[i])); 
                    }
                    console.log(this.events); //DOESN'T work
                }
            };
            xhr.send();
        }
    },
    methods: {
        convertJSONToEvent(o){
            //do something to o..
            console.log('o was modified');
            return o;
        },

如何让第二个示例中的上述调用在这里工作? IE。我将如何访问数据和方法?是否可以同时声明一个变量和“导出默认值”,以便导出的默认值可以引用自身?

【问题讨论】:

  • data 必须是一个函数。咨询:vuejs.org/v2/guide/components.html#data-Must-Be-a-Function
  • 对不起,急于简化 - 所以奖金信息,我编辑了,但是如何在内部引用方法,特别是。在created 部分? (尤其是现在,如何访问和设置 data() 中的节点?)

标签: javascript ecmascript-6 vuejs2


【解决方案1】:

你可以使用箭头函数xhr.onload = (a)=>{}来解决这个问题。

普通函数 function(){} 绑定自己的 this 上下文,所以 this 将不再引用 Vue 组件实例

箭头函数没有自己的this,所以this会自动继承自组件。

如果你不想使用箭头函数(因为某些浏览器不支持它),你可以先将this保存在一个变量中,然后在函数中使用它。 p>

var _this = this;
xhr.onload = function(a) {
  if (xhr.status === 200) {
    for (var i in xhr.response.data) {
      // use _this
      console.log(_this.convertJSONToEvent(xhr.response.data[i]));
    }
    console.log(_this.events); // use _this
  }
};

【讨论】:

  • 这是 ES6 转译为 ES5。谢谢你提醒我这个功能,我讨厌使用var _this = this;(当然你也这样做)。有效。但是当我过分尝试将created: function() { 更改为created: () => { 时,它不再识别this.convertJSONToEvent。为什么?还有,我将如何在数据中设置一个值?
  • @OliverWilliams 这可以通过将created: () => { 更改为created() {created: function(){ 来解决。这又是由于this 上下文。因为如果您在 created 钩子中使用箭头函数,您将引用组件定义之外的 this。箭头功能很有用,但不应该一直使用。
  • 我明白了,这与您之前的评论有关。我已经使用 createddata 中为主要的 Vue 实例设置了一个值或数组,但是如何在组件中做同样的事情呢?
  • 你可以在一个组件中做同样的事情。在created hook中设置组件的数据。
猜你喜欢
  • 2021-08-07
  • 2018-04-14
  • 1970-01-01
  • 2013-06-07
  • 2017-12-06
  • 2021-06-16
  • 2017-02-01
  • 2017-11-12
  • 2019-09-07
相关资源
最近更新 更多