如何在Vue 2中设置组件非反应数据?

Dav*_*ave 22 javascript components vue.js vuejs2

我有一个类别数组,它被加载一次(在创建的钩子中),然后它一直是静态的.我在组件模板中渲染此数组值.

<template>
    <ul>
        <li v-for="item in myArray">{{ item }}</li>
    </ul>
</template>
Run Code Online (Sandbox Code Playgroud)

我的数据属性看起来(它不包括myArray - 我不想要反应绑定):

data() {
    return {
        someReactiveData: [1, 2, 3]
    };
}
Run Code Online (Sandbox Code Playgroud)

我的创建钩子:

created() {
    // ...
    this.myArray = ["value 1", "value 2"];
    // ...
}
Run Code Online (Sandbox Code Playgroud)

问题是,Vue抛出错误 - 我无法在模板中使用myArray,因为在创建DOM时不会创建此变量 - 已挂载.

那怎么做?或者在哪里可以存储组件常量?

Vam*_*hna 25

Vue将data选项中的所有属性设置为setter/getters以使它们具有反应性.请参阅深度反应性

由于您希望myArray是静态的,因此可以将其创建为可以使用的自定义选项vm.$options

export default{
    data() {
        return{
            someReactiveData: [1, 2, 3]
        }
    },
    //custom option name myArray
    myArray: null,
    created() {
        //access the custom option using $options
        this.$options.myArray = ["value 1", "value 2"];
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在模板中迭代这些自定义选项,如下所示:

<template>
    <ul>
        <li v-for="item in $options.myArray">{{ item }}</li>
    </ul>
</template>
Run Code Online (Sandbox Code Playgroud)

这是小提琴

  • @DmitriySintsov我不明白,是不是整个目标?在模型上附加非反应数据的地方? (5认同)

Bog*_*anL 15

实际上,在设置属性thiscreated()应开箱的:

<template>
  <div id="app">
    <ul>
      <li v-for="item in myArray" :key="item">
        {{ item }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: "app",
  created() {
    this.myArray = [
      'item 1',
      'item 2'
    ];
  }
};
</script>
Run Code Online (Sandbox Code Playgroud)

将呈现

<div id="app">
  <ul>
    <li>
      item 1
    </li>
    <li>
      item 2
    </li>
  </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

在这里演示:https://codesandbox.io/s/r0yqj2orpn.


rol*_*oli 7

我更喜欢使用这样的静态数据(非反应性):

static_data.js使用以下内容创建一个 mixin(我命名它)

import Vue from 'vue'

Vue.prototype.$static = {}

export default {
  beforeCreate () {
    const vue_static = this.$options.static
    const vue_static_destination = this.$static || this

    if (vue_static && typeof(vue_static) === 'function') {
      Object.assign(vue_static_destination, vue_static.apply(this))
    } else if (vue_static && typeof(vue_static) === 'object') {
      Object.assign(vue_static_destination, vue_static)
    }      
  }
}
Run Code Online (Sandbox Code Playgroud)

在要使用静态数据的组件中,您可以执行以下操作:

import use_static_data from '@mixins/static_data'

export default {
  mixins: [use_static_data],

  static: () => ({
    static_value: 'Vue is awesome'
  }),

  created () {
    console.log(this.$static.static_value); // Vue is awesome
  }
}
Run Code Online (Sandbox Code Playgroud)

还有一个包vue-static

学分在这里

  • 这应该真正转换为代码块而不是图像。它将极大地改善这个问题/答案的搜索引擎优化。 (11认同)

rpa*_*ani 5

如果您想将其保留在 中data,正确的方法是使用Object.freeze(),如文档中所述:

唯一的例外是使用 Object.freeze(),它可以防止更改现有属性,这也意味着反应性系统无法跟踪更改。