【问题标题】:set property and retrieve HTML as string from Vue component设置属性并从 Vue 组件中检索 HTML 作为字符串
【发布时间】:2019-12-27 17:27:32
【问题描述】:

为了分离我的代码并使其更简洁,我想使用一个 Vue 组件作为 HTML 模板,将一些参数传递给模板并将生成的 HTML 作为字符串返回。

我做了一个几乎可以工作的简单示例,但由于某种原因,返回的 HTML 不是最新的。当我点击“点击我”时,我确实从“MyDetails”组件中获得了一个 HTML 字符串,但它显示了上次传递的值,我点击了“点击我”按钮,而不是显示实际值。

Main.vue

<template>
  <div>
    <p>
      <myDetails ref="myDetails"/>
    </p>
    <button @click="handleClick">click me</button>
    <p>{{message}}</p>
  </div>
</template>

<script>
import MyDetails from "/components/MyDetails.vue";

export default {
  name: "hello",
  components: {
    MyDetails
  },
  methods: {
    handleClick() {
      this.$refs.myDetails.setMessage(new Date().getTime());
      this.message = this.$refs.myDetails.$el.outerHTML;
    }
  },
  data() {
    return {
      message: ""
    };
  }
};
</script>

MyDetails.vue

<template>
  <div style="background-color:red">
    <h1>MyDetails component</h1>
    <p>{{message}}</p>
  </div>
</template>
<script>
export default {
  name: "hello",
  data() {
    return {
      message: ""
    };
  },
  methods: {
    setMessage(value) {
      this.message = value;
    }
  }
};
</script>

在上面的示例中,“MyDetails”从一开始就是模板的一部分。是否可以在点击处理程序中动态加载它,所以在我点击“点击我”按钮之前它不会显示?

请在此处查看代码:https://codesandbox.io/s/vue-fullcalendar-example-50sv9?fontsize=14&hidenavigation=1&theme=dark

【问题讨论】:

    标签: vue.js


    【解决方案1】:

    更新 DOM 需要时间,在更改其数据后,您会立即获得 myDetailsouterHTML,这没有时间让更改传播。如下设置轻微延迟将按预期提供输出:

    handleClick() {
        this.$refs.myDetails.setMessage(new Date().getTime());
        setTimeout(() => {
            this.message = this.$refs.myDetails.$el.outerHTML;
        }, 100) 
    }
    

    有关演示,请参阅the sandbox here

    【讨论】:

    • 谢谢。有用。你知道我是否可以动态加载组件然后传递参数,或者我是否需要从头开始将组件包含在标记中?
    • 我不太确定你的意思。要将参数传递给组件,您可以使用props。要在另一个组件中重用一个组件,import and register the child component in the parent component。还是在 vue 中使用 Dynamic component
    • 我想显示一个包含音乐会的日历,并使用一个组件作为每个音乐会的 HTML 模板。请查看“eventRender”-callback:[codesandbox.io/s/… 如您所见,模板组件在日历下方可见,并且显示的似乎只是上次音乐会的数据。因此,不是从一开始就嵌入组件,而是可以在每个 Concert 动态加载它,为 Concert 传递数据,获取 HTML 并再次丢弃该组件?
    • 我通过使用 Vue.extend() 解决了这个问题。我首先从“/components/EventDetails.vue”导入EventDetails,然后创建一个可以实例化的类: var EventDetailsClass = Vue.extend(EventDetails);然后我创建一个类的实例: let EventDetailsInstance = new EventDetailsClass();然后我传递数据、挂载组件并获取 HTML。这里的沙盒:[codesandbox.io/s/vue-fullcalendar-example-pqctv]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2019-01-18
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多