Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
| js:vuejs:faq [2018/06/09 19:08] – [Вызов через внутренний компонент 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(' | + | |
| - | }, | + | |
| - | } | + | |
| - | </ | + | |
| - | </ | + | |