Vue模型没有更新

时间:2018-04-13 04:55:44

标签: vue.js vuejs2

当我尝试更新我的自定义文本区域组件的模型数据this.message='<span id="foo">bar</span>时,文本和html不会显示在htmltextarea标记中,但我可以在Vue开发工具的控制台中看到更新。我也尝试使用Vue.set切换到对象而不是字符串,但这也不起作用。

有关如何解决此问题的任何建议?

htmlTextArea组件的目标是从htmlTextArea标签获取用户文本(这可行),操作此文本并将其绑定回textarea,但其中包含HTML。

自定义文本区域组件:

<template>
  <div contenteditable="true" @input="updateHTML" class="textareaRoot"></div>
</template>
<script>
export default {
  // Custom textarea 
  name: 'htmlTextArea',
  props:['value'],
  mounted: function () {
      this.$el.innerHTML = this.value;
  },
  methods: {
      updateHTML: function(e) {
          this.$emit('input', e.target.innerHTML);
      }
  }
}
</script>

其他组成部分:

<template>
...
<htmlTextArea id="textarea" v-model="message"></htmlTextArea>
...
</template>
<script>
      data: {
        return {
          message: 'something'//this works
        }
      }
     ...
     methods: {
      changeText() {
        this.message='<span id="foo">bar</span>'//this does not
      }
     },
     components: {
         htmlTextArea
     }
</script>

2 个答案:

答案 0 :(得分:7)

您需要在value道具更改后明确设置值。您可以watch更改value

<template>
    <div contenteditable="true" @input="updateHTML" class="textareaRoot"></div>
</template>
<script>

export default {
  // Custom textarea
  name: "htmlTextArea",
  props: ["value"],
  mounted: function() {
    this.$el.innerHTML = this.value;
  },
  watch: {
      value(v) {
          this.$el.innerHTML = v;
      }
  },
  methods: {
    updateHTML: function(e) {
      this.$emit("input", e.target.innerHTML);
    }
  }
};
</script>

答案 1 :(得分:2)

draw(_:)属性更改为函数,因为您已定义它不是被动的。

data

现在,当您更新方法中的data () { return { message: 'something'//this works } } 属性时,组件将相应地更新。

Reactivity in depth