【问题标题】:Vue 3: access to data object inside componentVue 3:访问​​组件内的数据对象
【发布时间】:2020-10-21 12:29:39
【问题描述】:

Vue 3 文档中的这段代码,它正在运行。

const data = { a: 1 }

// The object is added to a component instance
const vm = Vue.createApp({
  data() {
    return data
  }
}).mount('#app')

console.log(vm.a) // => 1

但是,如果我使用render() 函数创建组件,我无法访问数据对象。

let options = window[this.data.get('index')];
options.baseUrl = window['baseUrl'];
const app2 = Vue.createApp({
     render() {
         const {h} = Vue;
             return h(app.component('ComponentA'), options)
         }
      })
     .mount("#app");

console.log(app2.baseUrl);  // undefined
console.log(app2.$data); // {}

【问题讨论】:

    标签: javascript vue.js vuejs3


    【解决方案1】:

    定义一个普通数据选项并将 options 添加到其中:

    let options = {}
    options.baseUrl = "someurl.com";
    const app2 = Vue.createApp({
        data() {
          return {
            options
          }
        },
        render() {
    
          const {
            h
          } = Vue;
          return h(Vue.createApp({}).component('ComponentA', {
            template: '<h1>hello</h1>'
          }))
        }
      })
      .mount("#app");
    
    console.log(app2.options);
    <script src="https://unpkg.com/vue@3.0.0-rc.11/dist/vue.global.prod.js"></script>
    
    <div id="app" someVariable='some value'>
      Vue 3 app
    </div>

    【讨论】:

    • 好吧,我想访问ComponentA 中的数据对象。在您的示例中,似乎我只能获得传递给app2 的选项。
    【解决方案2】:

    显然您的 options 对象的签名错误。 尝试将您的选项变量更改为:

    let options = {
      data: {
        index: window[this.data.get('index')]
      }
    };
    

    【讨论】:

      【解决方案3】:

      如果您使用渲染函数将变量传递给它,您还可以使用createApp 的第二个参数来填充道具。

      如果您想更改 options 反应式,您可以使用 $props 作为 options 对象的反应式版本。您可以重新分配options 或使用新变量。这将使更改在应用程序中反应,因此更改应用程序之外的值将更新应用程序。对app2.baseUrl 的更改不会是反应性的,但reactiveOptions.baseUrl 会是反应性的。

      示例:

      let options = { baseUrl: "localhost:3k/" }
      
      const app2 = Vue.createApp({
        props: ['baseUrl'],
        template:'<h1>APP2 @{{ baseUrl }}</h1>'
      }, options).mount("#app");
      
      let reactiveOptions = app2.$props;
      
      console.log(app2.baseUrl);
      console.log(reactiveOptions);
      
      function onClick(){
        reactiveOptions.baseUrl += "&key="
      }
      <script src="https://unpkg.com/vue@3.0.0-rc.13/dist/vue.global.prod.js"></script>
      <div id="app"></div>
      
      <Button onclick="onClick()">change</Button>

      【讨论】:

      • 好吧,我的主要目的是更改数据对象中的变量值,该数据对象是watched,触发特定操作。
      • 在这种情况下,无论您使用的是道具还是数据都无关紧要。但是,您可以使用 options 作为起点,然后使用响应式选项对象(如更新示例中所示)。当对象作为 props 传递时,$props 对象将是响应式的,因此您可以直接对其进行更改。
      猜你喜欢
      • 1970-01-01
      • 2016-08-14
      • 2017-12-31
      • 2021-05-24
      • 2022-01-05
      • 2021-04-14
      • 2021-01-04
      • 2018-08-03
      • 2017-10-17
      相关资源
      最近更新 更多