Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
js:vuejs:faq [2018/06/09 19:07] – [Вызов через внешний компонент EventBus] mirocow | js:vuejs:faq [2018/06/09 20:05] (текущий) – mirocow | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== Вопрос / Ответ ====== | ====== Вопрос / Ответ ====== | ||
- | ====== Вызовы компонентов ====== | + | * [[js:vuejs:faq:call-methods-from-components]] |
- | + | ||
- | {{:js:vuejs:0_xzkw0-t4uea3d5yh.png? | + | |
- | + | ||
- | ==== Q: Как вызвать метод из дочернего компонента? | + | |
- | + | ||
- | === Вызов через глобальный компонент EventBus === | + | |
- | + | ||
- | <code javascript> | + | |
- | const EventBus = new Vue(); | + | |
- | + | ||
- | new Vue({ | + | |
- | name: 'app-example', | + | |
- | created() { | + | |
- | EventBus.$emit(' | + | |
- | } | + | |
- | }); | + | |
- | </ | + | |
- | + | ||
- | <code javascript> | + | |
- | const = childComponent = { | + | |
- | | + | |
- | onFirstClick() { | + | |
- | }, | + | |
- | }, | + | |
- | created() { | + | |
- | EventBus.$on(' | + | |
- | this.onFirstClick(); | + | |
- | }); | + | |
- | }, | + | |
- | }; | + | |
- | </ | + | |
- | + | ||
- | <code html> | + | |
- | <div id=" | + | |
- | < | + | |
- | </div | + | |
- | </ | + | |
- | + | ||
- | Если не нужны параметры, | + | |
- | EventBus.$on(' | + | |
- | this.onFirstClick(); | + | |
- | }); | + | |
- | </ | + | |
- | + | ||
- | === Вызов через внутренний компонент EventBus === | + | |
- | + | ||
- | <code javascript> | + | |
- | var bus = new Vue({}) | + | |
- | + | ||
- | Object.defineProperty(Vue.prototype, | + | |
- | get(){ | + | |
- | return this.$root.bus; | + | |
- | }, | + | |
- | set(newInstance){ | + | |
- | this.$root.bus = newInstance; | + | |
- | }, | + | |
- | }); | + | |
- | + | ||
- | new Vue({ | + | |
- | name: ' | + | |
- | created() { | + | |
- | this.$bus.$emit(' | + | |
- | } | + | |
- | }); | + | |
- | </ | + | |
- | + | ||
- | <code javascript> | + | |
- | const = childComponent = { | + | |
- | methods: { | + | |
- | onFirstClick() { | + | |
- | }, | + | |
- | }, | + | |
- | created() { | + | |
- | this.$bus.$on(' | + | |
- | this.onFirstClick(); | + | |
- | }); | + | |
- | }, | + | |
- | }; | + | |
- | </ | + | |
- | + | ||
- | <code html> | + | |
- | <div id=" | + | |
- | < | + | |
- | </div | + | |
- | </ | + | |
- | + | ||
- | ==== Q: Как вызвать метод из родительского компонента? | + | |
- | + | ||
- | === С помощью %emit === | + | |
- | + | ||
- | <code javascript> | + | |
- | const childComponent = { | + | |
- | name: ' | + | |
- | methods: { | + | |
- | something() { this.$emit(' | + | |
- | } | + | |
- | }); | + | |
- | </ | + | |
- | + | ||
- | <code html> | + | |
- | < | + | |
- | </ | + | |
- | + | ||
- | <code javascript> | + | |
- | new Vue({ | + | |
- | methods: { | + | |
- | handler(params) { | + | |
- | console.log(params); | + | |
- | } | + | |
- | } | + | |
- | }); | + | |
- | </ | + | |
- | + | ||
- | === Через ссылки $refs === | + | |
- | + | ||
- | <code javascript> | + | |
- | import ChildForm from './components/ | + | |
- | + | ||
- | new Vue({ | + | |
- | el: '# | + | |
- | data: { | + | |
- | item: {} | + | |
- | }, | + | |
- | template: ` | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | </ | + | |
- | `, | + | |
- | methods: { | + | |
- | submit() { | + | |
- | this.$refs.form.submit() | + | |
- | } | + | |
- | }, | + | |
- | components: { ChildForm }, | + | |
- | }); | + | |
- | </ | + | |
- | + | ||
- | <code html> | + | |
- | < | + | |
- | ... | + | |
- | </ | + | |
- | + | ||
- | < | + | |
- | export default { | + | |
- | name: ' | + | |
- | props: [' | + | |
- | methods: { | + | |
- | submit() { | + | |
- | ... | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | </ | + | |
- | </ | + | |
- | + | ||
- | ==== Через системный вызов $bus ==== | + | |
- | + | ||
- | <code javascript> | + | |
- | import ChildForm from ' | + | |
- | + | ||
- | new Vue({ | + | |
- | el: '# | + | |
- | data: { | + | |
- | item: {}, | + | |
- | bus: new Vue(), | + | |
- | }, | + | |
- | template: ` | + | |
- | < | + | |
- | < | + | |
- | < | + | |
- | </ | + | |
- | `, | + | |
- | methods: { | + | |
- | submit() { | + | |
- | this.bus.$emit(' | + | |
- | } | + | |
- | }, | + | |
- | components: { ChildForm }, | + | |
- | }); | + | |
- | </ | + | |
- | + | ||
- | <code html> | + | |
- | < | + | |
- | ... | + | |
- | </ | + | |
- | + | ||
- | < | + | |
- | export default { | + | |
- | name: ' | + | |
- | props: [' | + | |
- | methods: { | + | |
- | submit() { | + | |
- | ... | + | |
- | } | + | |
- | }, | + | |
- | mounted() { | + | |
- | this.bus.$on(' | + | |
- | }, | + | |
- | } | + | |
- | </ | + | |
- | </ | + |