Nano Hash - криптовалюты, майнинг, программирование

Как добавить узел Dom, созданный с помощью JavaScript, в vue с помощью функций рендеринга vue

У меня есть функция JavaScript, которая возвращает узел DOM, представляющий древовидное представление с множеством вложенных узлов внутри него, я хотел бы знать, можно ли передать эту функцию в функцию рендеринга vue ??

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

Спасибо за любую помощь.


Ответы:


1

Я не знаю ни одного механизма для этого (по крайней мере, официально). Функция рендеринга - не место, где можно каким-либо образом манипулировать DOM.

Вы по-прежнему можете осторожно манипулировать DOM вне функции рендеринга, не слишком беспокоя Vue. Если у вас есть пустой заполнитель <div> в вашем шаблоне с ref, тогда добавление дочернего элемента к нему должно быть нормальным, пока элемент DOM остается на месте (использование v-if в div может мешать, но я не уверен на 100% этого). Vue обычно хорошо справляется с повторным использованием одного и того же элемента DOM при повторном рендеринге - но в том-то и дело, что вы возитесь с DOM, над которым Vue думает, что он имеет полный контроль, и вам не гарантируется, что Vue будет сотрудничать с любыми внешними изменения в DOM, которых он не ожидал.

Подумав об этом немного подробнее, вы можете добиться желаемого с помощью настраиваемой директивы или компонента Vue. Что-то вроде этого:

Vue.directive('el', {
  bind(el, binding) {
    if (binding.value) {
      el.appendChild(binding.value)
    }
  },
  update(el, binding) {
    // Check if bound element changed
    if (binding.oldValue !== binding.newValue) {
      if (binding.oldValue) {
        // Remove old element
        binding.oldValue.remove()
      }
      if (binding.value) {
        // Append new element
        el.appendChild(binding.value)
      }
    }
  }
})

// Create a DOM element manually
const btn = document.createElement('button')
btn.textContent = 'Click'

new Vue({
  el: '#app',
  render(h) {
    return h('div', {
      directives: [
        {
          name: 'el',
          value: btn
        }
      ]
    })
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

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

13.01.2020
  • Я реализовал ваше предложение, и оно работает, но я читал документы Vue, чтобы попытаться лучше понять функции рендеринга, и мой вопрос: почему мы не можем использовать что-то подобное, чтобы вставить нужные нам узлы в дом? domProps: { innerHTML: this.createTreeView() } Простой текст работает, но не функция, возвращающая узел. Спасибо за ваше время. 14.01.2020
  • Мы не можем этого сделать, потому что Vue этого не позволяет. Это потенциально может быть что-то, что Vue может сделать, но в настоящее время это не поддерживается. 16.01.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..