【问题标题】:How dynamically change the component with object for props in vueJS如何在 vueJS 中使用 props 的对象动态更改组件
【发布时间】:2021-09-05 18:08:13
【问题描述】:

你知道如何用object prop动态改变组件

App.vue

<template>
  <div id="app">
    <component :is="current['test'].target.name"> </component>
    <input type="button" value="click me" @click="change" />
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld";
import Comp from "./components/Comp.vue";

export default {
  name: "App",
  components: {
    HelloWorld,
    Comp,
  },
  data() {
    return {
      current: {},
    };
  },
  created() {
    this.current["test"] = {
      index: 0,
      target: {
        name: "Comp",
      },
    };
  },
  methods: {
    change() {
      const r =
        this.current["test"].target.name === "HelloWorld"
          ? "Comp"
          : "HelloWorld";
      this.current["test"].target = {
        name: r,
      };
      console.log(this.current["test"]);
    },
  },
};
</script>

Comp.vue

<template>
  <p>Template 2</p>
</template>

HelloWorld.vue

<template>
  <p>Template 1</p>
</template>

https://codesandbox.io/s/clever-water-dgbts?file=/src/components/HelloWorld.vue:0-42

对象的值会正确改变,但组件不会改变。

谢谢

【问题讨论】:

    标签: javascript vue.js vuejs2


    【解决方案1】:

    这里的问题是属性 test 未在数据定义中的对象 current 上定义 - 您在 created() 函数中设置定义。这意味着 Vue 不知道为该属性创建响应式 getter/setter。

    将您的数据定义更改为:

    data() {
      return {
        current: {
          test: {
            index: 0,
            target: {
              name: "Comp"
            }
          }
        }
      };
    }
    

    由于 Vue 的反应方式(需要预定义的属性),我建议不要将属性作为字典项访问,即使用:

    current.test.target.name
    

    而不是

    current['test'].target.name
    

    有关 Vue 反应性的更多信息,请参阅此页面:link

    【讨论】:

    • 你打败了我,所以 +1。 Vue2 中的另一种选择是使用 Vue.set 向反应性对象添加属性:vuejs.org/v2/api/#Vue-set
    猜你喜欢
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2022-01-22
    • 2021-07-28
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    相关资源
    最近更新 更多