Я изучаю VueJS, используя его с приложением rails, и у меня возникают проблемы при попытке доступа к компоненту из родительского компонента.Возможно, я делаю это неправильно, но я не могу понять, в чем проблема.
Я пытался свести мою проблему к простому HTML-примеру:
<html>
<head>
<meta charset='utf-8' />
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js"></script>
</head>
<body>
<div id="app">
<outer>
<div>
<form>
<inner ref="testref"><input/></inner>
</form>
</div>
</outer>
</div>
<script>
let inner = Vue.component('inner', {
template: `
<div>
<span hidden="true"><slot></slot></span>
<input v-model="searchText" />
</div>
`,
props: ['placeholder'],
data: function() {
return {
searchText: this.placeholder
}
}
})
let outer = Vue.component('outer', {
template: `
<div>
<h3 v-on:click="testos">Hello: {{ client_id }}</h3>
<slot></slot>
</div>
`,
data: function() {
console.log('data', this.$refs.testref)
return {
client_id: ''
}
},
mounted: function() {
console.log('mounted', this.$refs.testref)
},
methods: {
testos: function() {
console.log('method', this.$refs.testref)
}
}
})
new Vue({
el: '#app',
components: {
'inner': inner,
'outer': outer
}
})
</script>
</body>
</html>
Я получаю следующие журналы консоли:
data undefined
mounted undefined
method undefined
Я пытался следовать синтаксису в https://vuejs.org/v2/api/#ref,, но я также пытался использовать :ref
вместо ref
, и это не 'лучше не работает.
Я понимаю, что есть осложнение «сроков регистрации», даже если я не до конца понимаю.Однако не должны ли быть правильные сроки при нажатии на H3?Я надеялся, что это будет решено даже mounted
, как в https://stackoverflow.com/a/40884455/2730032.
Бонусный вопрос: Мой вопрос действительно о том, как работает ref.Тем не менее, у меня есть более общая проблема, которая может быть полезна для советов, не использующих ref.
У меня есть компонент inner
, который меня порадовал тем, что оборачивает поле ввода для client_id с полем поиска, которое дает некоторыеПодобные выбору опции из API и устанавливают поле ввода client_id для выбранной опции.Я хочу повторно использовать этот компонент inner
в компоненте outer
, который будет использовать client_id (всякий раз, когда он изменяется inner
) для вызова API и заполнения множества других полей формы в компоненте outer
(эти поля задаются с inner
до outer
через слоты).Если это имеет какой-то смысл.
Я решил, что лучший способ сделать это - указать client_id в качестве поля данных inner
и outer
получить к нему доступ через ref
.Поэтому я пытаюсь заставить ref
работать.
EDIT1: Произошла ошибка копирования, извините за это.Тег test1 был из предыдущей версии.Но я все равно получаю эту проблему.
РЕДАКТИРОВАТЬ 2: Я принял второй ответ Роя Дж, потому что я чувствую, что он лучше всего отвечает на вопрос, и хотя это не очень хороший дизайн, это, вероятно, правильное решение для некоторыхлюди.Однако в моей реальной реализации я использовал первый ответ Роя Дж, и, возможно, кому-то, кто читает этот вопрос, тоже следует (мне также удалось добавить inner
в шаблон outer
, чтобы избежать использования app
).