【问题标题】:Vue model not updatingVue模型不更新
【发布时间】:2018-04-13 04:55:43
【问题描述】:

当我尝试更新我的自定义文本区域组件的模型数据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>

【问题讨论】:

    标签: vue.js vuejs2


    【解决方案1】:

    data 属性更改为一个函数,正如您定义的那样,它不是响应式的。

    data () {
        return {
            message: 'something'//this works 
        }
    }
    

    现在,当您在方法中更新 message 属性时,组件将相应更新。

    Reactivity in depth

    【讨论】:

    • 你是对的,但是,我实际上已经在那里有回报,我只是没有把它复制到这里。不过还是不行
    【解决方案2】:

    您需要在 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>
    

    【讨论】:

    • 实际上我认为这很有效,但现在当我输入我的文本区域时,它会反向输入所有内容。所以'foo bar'变成'rab oof'。知道为什么吗?
    • 请在 js fiddle 中演示?
    • 但是写完一个字光标会跳到段首
    猜你喜欢
    • 2021-11-14
    • 2021-05-19
    • 1970-01-01
    • 2017-11-23
    • 2017-05-30
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多