Vue:需要禁用页面上的所有输入

Tom*_*mer 8 vue.js vue-directives

我正在开发一个具有不同许可证类型的应用程序,根据许可证我们需要禁用/启用输入。

一种方法是:disabled为每个输入设置一个条件,但这需要大量工作并且容易出错,因为我们可能会忘记将它放在某些输入上。

我想过使用这样的指令v-disable-all来搜索容器下的所有输入并将其添加为禁用。

我在徘徊是否有更好的解决方案,或者是否已经有这样的解决方案?

Elm*_*tou 12

我来得有点晚了,但是 HTML 元素上有一个名为“disabled”的属性,它...禁用树中的每个输入。

<fieldset :disabled="!canEdit">
  ...
</fieldset>
Run Code Online (Sandbox Code Playgroud)

canEdit可以是计算属性或任何你想要的。


Tom*_*mer 9

我最终创建了这个指令:

import Vue from "vue";

Vue.directive("disable-all", {
  // When all the children of the parent component have been updated
  componentUpdated: function(el, binding) {
    if (!binding.value) return;
    const tags = ["input", "button", "textarea", "select"];
    tags.forEach(tagName => {
      const nodes = el.getElementsByTagName(tagName);
      for (let i = 0; i < nodes.length; i++) {
        nodes[i].disabled = true;
        nodes[i].tabIndex = -1;
      }
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

  • “我想使用像 v-disable-all 这样的指令来搜索容器下的所有输入并将其添加到禁用状态。” 这是我的问题的引述,然后我问是否有另一种更好的方法。你只是告诉我做我想做的事。此外,您是用简单的 JS 编写的,而不是作为 Vue 指令编写的,所以我对您的努力竖起了大拇指,但您并没有真正回答我的问题。 (4认同)

小智 6

你可以这样做:

let elems = document.getElementById('parentDiv').getElementsByTagName('input');

这将为您提供父项内的所有输入,然后您可以运行一个简单的 for 循环来遍历它们并将每个输入设置为禁用。

像这样的东西:

for(let i = 0; i < elems.length; i++) {
    elems[i].disabled = true;
}
Run Code Online (Sandbox Code Playgroud)

希望这有助于您走上正确的道路。

for(let i = 0; i < elems.length; i++) {
    elems[i].disabled = true;
}
Run Code Online (Sandbox Code Playgroud)
let elems = document.getElementById('someid').getElementsByTagName('input');

console.log(elems);

for(let i = 0; i < elems.length; i++) {
  elems[i].disabled = true;
}
Run Code Online (Sandbox Code Playgroud)