Основные моменты DataSeries:

  • Vue.js - это простой в использовании фреймворк для веб-приложений, который мы можем использовать для разработки интерактивных интерфейсных приложений.

В этой статье мы рассмотрим, как получить доступ к различным частям родительского, дочернего или корневого компонента. Также мы смотрим на внедрение зависимостей в Vue.js

Доступ к элементам и компонентам

Иногда нам нужно получить доступ к другим компонентам из данного компонента. Однако делать это часто - плохая идея, так как это быстро становится беспорядочным.

Доступ к корневому экземпляру

Мы можем получить доступ к корневому экземпляру из дочернего компонента с помощью свойства $root.

Например, мы можем получить доступ к свойству foo корневого экземпляра Vue следующим образом:

src/index.js :

Vue.component("foo", {
  template: `<p>{{rootFoo}}</p>`,
  computed: {
    rootFoo() {
      return this.$root.foo;
    }
  }
});
new Vue({
  el: "#app",
  data: {
    foo: "bar"
  }
});

index.html :

<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <meta charset="UTF-8" />
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <foo></foo>
    </div>
    <script src="src/index.js"></script>
  </body>
</html>

Приведенный выше код создал rootFoo вычисляемое свойство из foo компонента корневого экземпляра Vue и отобразил его внутри компонента foo.

Таким образом, мы получаем foo.

Также могут быть установлены данные, возвращаемые из $root, и могут быть вызваны его методы.

Итак, мы можем написать:

this.$root.foo = 2

or:

this.$root.baz()

из любого подкомпонента в дополнение к доступу к значениям свойств.

Доступ к экземпляру родительского компонента

Подобно $root, мы можем получить доступ к свойствам родительского компонента с помощью свойства $parent из дочернего компонента.

Это не следует использовать часто, потому что трудно отследить, когда были установлены родительские данные, поэтому мы должны передавать реквизиты дочернему элементу вместо прямого доступа к свойству $parent.

Например, мы можем использовать это так:

src/index.js :

Vue.component("child", {
  template: `<p>{{parentFoo}}</p>`,
  computed: {
    parentFoo() {
      return this.$parent.foo;
    }
  }
});
Vue.component("parent", {
  data() {
    return {
      foo: "bar"
    };
  },
  template: `
    <p><slot></slot></p>
  `
});
new Vue({
  el: "#app"
});

index.html :

<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <meta charset="UTF-8" />
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <parent>
        <child></child>
      </parent>
    </div>
    <script src="src/index.js"></script>
  </body>
</html>

В приведенном выше коде мы получили доступ к свойству foo компонента parent из компонента child, используя this.$parent в вычисляемом свойстве parentFoo. Итак, на экране отображается bar.

Доступ к экземплярам дочерних компонентов и дочерним элементам

Мы можем получить доступ к дочернему компоненту прямо в JavaScript. Для этого мы можем добавить атрибут ref к дочернему компоненту и присвоить имя в качестве значения.

Затем мы можем использовать this.$refs.name для доступа к компоненту, где name - это имя, которое мы установили.

Например, мы можем использовать это так:

src/index.js :

new Vue({
  el: "#app",
  mounted() {
    this.$refs.input.focus();
  }
});

index.html :

<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <meta charset="UTF-8" />
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <input ref="input" />
    </div>
    <script src="src/index.js"></script>
  </body>
</html>

В приведенном выше примере мы добавили ref с именем input в шаблон, а затем получили доступ к элементу ввода с помощью:

this.$refs.input

И затем вызвал focus на него в хук mounted.

Это позволяет нам сфокусировать ввод сразу после загрузки элемента ввода.

Мы также можем получить доступ к методам дочернего компонента следующим образом:

src/index.js :

Vue.component("base-input", {
  methods: {
    focus() {
      this.$refs.input.focus();
    }
  },
  template: `<input ref='input' />`
});
new Vue({
  el: "#app",
  mounted() {
    this.$refs.baseInput.focus();
  }
});

index.html :

<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <meta charset="UTF-8" />
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <base-input ref="baseInput"></base-input>
    </div>
    <script src="src/index.js"></script>
  </body>
</html>

В приведенном выше коде наш корневой экземпляр Vue при монтировании вызвал base-input focus метод.

Следовательно, мы видим, что вход находится в фокусе при загрузке base-input.

Внедрение зависимости

Чтобы предотвратить прямой доступ к родительскому компоненту и корневому экземпляру Vue, мы можем использовать внедрение зависимостей, чтобы получить компонент, который мы хотим получить.

Мы можем использовать его следующим образом:

src/index.js :

Vue.component("foo-button", {
  methods: {},
  inject: ["toggleFoo"],
  template: `<button @click='toggleFoo'>Toggle Foo</button>`
});
new Vue({
  el: "#app",
  data: {
    foo: ""
  },
  provide() {
    return {
      toggleFoo: this.toggleFoo
    };
  },
  methods: {
    toggleFoo() {
      this.foo = this.foo === "foo" ? "" : "foo";
    }
  }
});

index.html :

<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <meta charset="UTF-8" />
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <foo-button></foo-button>
      {{foo}}
    </div>
    <script src="src/index.js"></script>
  </body>
</html>

В приведенном выше коде мы добавили метод provide для возврата объекта с элементами, которые мы хотим сделать доступными для дочерних компонентов.

Мы сделали toggleFoo метод корневого экземпляра Vue доступным для нашего foo-button компонента.

Затем в компоненте foo-button мы внедрили метод toggleFoo от родителя к foo-button, а затем мы вызываем его, когда на кнопке запускаются события щелчка.

Мы, как обычно, включили в шаблон foo-button.

В конце концов, мы должны увидеть, что мы переключаем слово foo на экране, когда нажимаем на кнопку.

Заключение

Мы можем получить доступ к корневому экземпляру Vue с помощью $root и к родительскому компоненту с помощью $parent.

Чтобы получить доступ к дочернему компоненту от родителя, мы можем присвоить ref имя дочернему компоненту, а затем использовать this.$refs для доступа к нему.

Эти свойства не следует использовать слишком часто, потому что они быстро создают беспорядок.

Чтобы доступ к внешним компонентам оставался чистым и отслеживаемым, мы можем использовать внедрение зависимостей, определив метод provide для раскрытия определенных частей компонента и используя inject для получения предоставленных частей.