0

这似乎应该是一个简单的解决方案,但出了点问题......

我需要有条件地从元素中删除 contenteditable属性:

<!-- first state -->
<div contenteditable="true"></div>

<!-- second state -->
<div></div>

我试过了:

data() {
    return {
      contenteditable: true,
      title: "Title",
    };
  },
  methods: {
    handleClick() {
      this.contenteditable = null;
      this.title = null;
    },
  },
  render(createElement) {
    const options = {
      attrs: {
        id: "ID",
        title: this.title,
        contenteditable: this.contenteditable,
        // Not working either
        //...(this.contenteditable && { contenteditable: true }),
      },
      domProps: {
        innerHTML: "<p>Test</p>",
      },
      on: {
        click: this.handleClick,
      },
    };

    return createElement("div", options);
  },

沙盒

结果是:<div contenteditable="false"></div>,但我需要完全删除属性。例如title,属性按预期工作,如果它的值设置为 null,它不会呈现。我还尝试使attrs对象完全反应,例如:

data() {
  return {
    attrs: {
      title: 'Title',
      contenteditable: true,
    }
  }
},
methods: {
  handleClick() {
    Vue.delete(this.attrs, 'contenteditable')
    Vue.delete(this.attrs, 'title')
  },
},
render(createElement) {
    const options = {
      attrs: this.attrs,
      domProps: {
        innerHTML: "<p>Test</p>",
      },
      on: {
        click: this.handleClick,
      },
    };

    return createElement("div", options);
  },

沙盒

...但没有运气。任何想法如何解决这个问题?

谢谢!

4

2 回答 2

1

Vue 2 在这里将contenteditable属性视为一种特殊情况,如果新的属性值为undefined. 这在 Vue 3 中是固定的(或计划的)。

您可以绕过此行为并将其设置为domProps

domProps: {
  contentEditable: this.contenteditable ? 'true' : 'inherit'
}

这是一个演示:

new Vue({
  el: '#app',
  data() {
    return {
      contenteditable: false
    }
  },
  render(h) {
    return h('div', [
      h('button', {
        on: {
          click: () => this.contenteditable = !this.contenteditable
        }
      }, `contenteditable: ${this.contenteditable}`),
      h('div', {
        domProps: {
          contentEditable: this.contenteditable ? 'true' : 'inherit'
        }
      }, 'Text')
    ])
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
</div>

于 2021-10-25T02:53:45.027 回答
0

假设您的 div 如下

<div id="editable"></div>

然后您使用以下方法切换 contenteditable

document.getElementById('editable').contentEditable = "true"

或者

document.getElementById('editable').setAttribute('contentEditable',"true")

如果你希望这个 div 在开始时是 contentEditable ,那么在里面添加上面的行mounted

于 2021-10-26T04:10:25.980 回答