отключенная опция добавлена в узел, не работающий с vuetify

#javascript #vue.js #vuetify.js

Вопрос:

Привет, я использую vuetify, и я создал эту директиву, чтобы я мог отключить все дочерние элементы родителя, у которого есть атрибут «Отключить», он идеально работает с некоторыми элементами (например, обычный текст ввода), но когда это тип флажка ( например, переключатель), они не отключаются… может ли vuetify быть причиной этого ? Я напечатал константу «Узлы» , и внутри нее есть флажок. Таким образом, он находит элементы и применяет свойство disabled, но просто не работает

Это директива

 directives: {    disableAll: {   componentUpdated: (el) =gt; {  const tags = ['input', 'button', 'textarea', 'select'];  tags.forEach(tagName =gt; {  const nodes = el.getElementsByTagName(tagName);  for (let i = 0; i lt; nodes.length; i  ) {  nodes[i].disabled = true;  nodes[i].tabIndex = -1;  }  });  }  },  

это html — код переключателя

 lt;div class="col"gt;  lt;div class="v-input my-0 v-input--is-label-active v-input--is-dirty theme--light v-input--selection-controls v-input--switch primary--text"gt;  lt;div class="v-input__control"gt;  lt;div class="v-input__slot"gt;  lt;div class="v-input--selection-controls__input"gt;  lt;input aria-checked="true" id="input-414" role="switch" type="checkbox" aria-disabled="false" value="true" disabled tabindex="-1"gt;  lt;div class="v-input--selection-controls__ripple primary--text"gt;lt;/divgt;  lt;div class="v-input--switch__track theme--light primary--text"gt;lt;/divgt;  lt;div class="v-input--switch__thumb theme--light primary--text"gt;  lt;!----gt;  lt;/divgt;  lt;/divgt;  lt;label for="input-414" class="v-label theme--light" style="left: 0px; right: auto; position: relative;"gt;Habilitar cartaslt;/labelgt;  lt;/divgt;  lt;div class="v-messages theme--light primary--text"gt;  lt;div class="v-messages__wrapper"gt;lt;/divgt;  lt;/divgt;  lt;/divgt;  lt;/divgt; lt;/divgt;  

и, как вы можете видеть в этой строке

 lt;input aria-checked="true" id="input-414" role="switch" type="checkbox" aria-disabled="false" value="true" disabled tabindex="-1"gt;  

Свойство disabled применяется , оно просто не работает

Я знаю, что у vuetify есть собственное отключенное свойство, которое вы можете добавить к каждому узлу, или это отключенное свойство, используемое в формах. Но я пытался настроить это с помощью директив, потому что есть некоторые элементы, которые мне не нужно отключать.

Комментарии:

1. Внутри v-switch этот флажок невидим (его непрозрачность равна 0). Таким образом, отключено или нет, вы не увидите никакого эффекта.

2. @Sphinx Я предполагаю, что часть вопроса, который я задал вам в вашем ответе, связана с этим

Ответ №1:

Если вы хотите активировать эффект пользовательского интерфейса только для v-switch , не меняйте состояние компонента, просто вы можете добавить className= v-input--is-disabled в его Dom v-switch , как показано ниже.:

 Vue.directive('disable-all', {  inserted: function (el) {  el.querySelectorAll('div.v-input.v-input--switch').forEach(item =gt; {  item amp;amp; item.classList.add('v-input--is-disabled')  })  } })  new Vue({  el: '#app',  vuetify: new Vuetify(),  data () {  return {  switches: [true, false],  }  }, }) 
 lt;script src="https://cdn.jsdelivr.net/npm/babel-polyfill/dist/polyfill.min.js"gt; lt;/scriptgt; lt;script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"gt;lt;/scriptgt; lt;script src="https://cdn.jsdelivr.net/npm/vuetify@2.6.1/dist/vuetify.min.js"gt;lt;/scriptgt; lt;link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet" type="text/css"gt; lt;link href="https://cdn.jsdelivr.net/npm/@mdi/font@6.x/css/materialdesignicons.min.css" rel="stylesheet" type="text/css"gt; lt;link href="https://fonts.googleapis.com/css?family=Material Icons" rel="stylesheet" type="text/css"gt; lt;link href="https://cdn.jsdelivr.net/npm/vuetify@2.6.1/dist/vuetify.min.css" rel="stylesheet" type="text/css"gt;  lt;div id="app"gt;  lt;v-app id="inspire"gt;  lt;v-container  class="px-0"  fluid  v-disable-all  gt;  lt;v-switch  v-model="switches[0]"  :label="`Switch 1: ${switches[0].toString()}`"  gt;lt;/v-switchgt;  lt;v-switch  v-model="switches[1]"  :label="`Switch 1: ${switches[1].toString()}`"  gt;lt;/v-switchgt;  lt;/v-containergt;  lt;/v-appgt; lt;/divgt; 

Комментарии:

1. Спасибо. Я предполагаю, что использование этой опции добавления v-ввода-отключено работает (потому что применяется стиль vuetify), но я все еще не понимаю, почему, если я использую опцию отключить html, это не работает, это вроде как не имеет смысла… Еще одна вещь, которую я понял с помощью вашего кода, заключается в том, что если я использую свойство vuetify, отключенное в компоненте v-переключателя, и удаляю эту часть «v-вход отключен» на html-странице, v-переключатель полностью деактивирован ( я ничего не могу сделать, даже когда удаляю это в классе), но если я использую ваш код и удаляю «v-вход отключен», v-переключатель работает совершенно нормально

2. поскольку приведенная выше директива добавляется только v-input--is-disabled в визуализированный dom, она не повлияет v-switch на состояние vnode.

3. так что, в конце концов, было бы плохой практикой реализовывать это так, как мы это делаем, добавляя простой класс или добавляя отключенных (как я написал в вопросе), не так ли ?

4. да, всегда рекомендуется использовать свойство Vuetify. 🙂