Пользовательская директива Vue.js, обращающаяся к контексту цикла - PullRequest
0 голосов
/ 16 ноября 2018
Vue.directive("custom", {
    inserted(el, binding, vnode) {
        let val = binding.value;
        let arg = binding.arg
        let mods = binding.modifiers
        let expr = binding.expression
        let cont = vnode.context
        .... // modify loop
    }
})

Я пытаюсь создать собственную директиву в vue.эта директива может быть использована внутри или снаружи цикла v-for.Когда он запускается внутри цикла v-for, мне нужен контекст текущей итерации

v-for="item in list"  // i need the context for item

Но я не знаю, как его получить.даже если используется версия v-для которой включен индекс

v-for="(item, index) in list"  // i need the context for item

, ни одно из этих значений не доступно в функции директивы вставки.По крайней мере, я нигде не могу их найти.

Любая помощь в поиске этих значений будет принята с благодарностью

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Используйте value в аргументе ловушки директивы binding .

Например, в v-custom="item", value будет item.

Vue.directive("custom", {
    inserted(el, binding, vnode) {
        let val = binding.value; // this value is the item
        let arg = binding.arg
        let mods = binding.modifiers
        let expr = binding.expression
        let cont = vnode.context
        .... // modify loop
    }
})

Пример (см. Журнал):

Vue.directive("custom", {
  inserted(el, binding, vnode) {
    let val = binding.value;
    let arg = binding.arg
    let mods = binding.modifiers
    let expr = binding.expression
    let cont = vnode.context

    console.log(val)
  }
})

new Vue({
  el: "#app",
  data: {
    todos: [{
        text: "Learn JavaScript",
        done: false
      },
      {
        text: "Learn Vue",
        done: false
      },
      {
        text: "Play around in JSFiddle",
        done: true
      },
      {
        text: "Build something awesome",
        done: true
      }
    ]
  },
  methods: {
    toggle: function(todo) {
      todo.done = !todo.done
    }
  }
})
body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

li {
  margin: 8px 0;
}

h2 {
  font-weight: bold;
  margin-bottom: 15px;
}

del {
  color: rgba(0, 0, 0, 0.3);
}
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>

<div id="app">
  <h2>Todos:</h2>
  <ol>
    <li v-for="todo in todos" v-custom="todo">
      <label>
        <input type="checkbox"
          v-on:change="toggle(todo)"
          v-bind:checked="todo.done">

        <del v-if="todo.done">
          {{ todo.text }}
        </del>
        <span v-else>
          {{ todo.text }}
        </span>
      </label>
    </li>
  </ol>
</div>
0 голосов
/ 16 ноября 2018

С https://vuejs.org/v2/guide/custom-directive.html

Директивным хукам передаются следующие аргументы:

el: элемент, с которым связана директива. Это может быть использовано для привязка: объект, содержащий следующие свойства.
...
значение: значение, переданное директиве. Например в v-my-directive = "1 + 1", значение будет 2.

И у вас это уже есть

let val = binding.value;

Вам просто нужно передать это директиве.

<div v-for="item in list" :v-custom="item"></div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...