Я работаю над приложением Вью 3. Я столкнулся с проблемой при работе с родительский компонент, дочерним компонентом и компонент внука.
В Main.vue
(родительский компонент):
<template>
<div class="main">
<h1>{{ title }}</h1>
<Filters
:usersData='users'
/>
</div>
</template>
<script>
import Filters from './Ui/Filters'
export default {
name: 'Posts',
components: {
Filters
},
props: {
title: String,
},
}
</script>
В ребенокFilters.vue
:
<template>
<label>Filter by author</label>
<MyDropdown
label="All authors"
:usersData='users'
/>
</template>
<script>
import MyDropdown from './MyDropdown'
import MyButton from './MyButton'
export default {
name: 'Filters',
components: {
MyDropdown,
MyButton
},
props: {
usersData: Object
},
data() {
return {
url: 'https://jsonplaceholder.typicode.com',
users: [],
}
},
async mounted() {
// Users
await this.axios.get(`${this.url}/users`).then((response) => {
if (response.status == 200) {
this.users = response.data;
console.log(this.users); // outputs the users correctly
}
}).catch((errors) => {
console.log(errors);
});
}
}
</script>
Tn компонент внука MyDropdown.vue
:
<template>
<div class="dropdown">
<button type="button" class="btn btn-sm dropdown-toggle" data-bs-toggle="dropdown">
{{ label }}
</button>
<ul v-if="usersData.length" class="dropdown-menu">
<li><a class="dropdown-item" href="#">Jane Doe</a></li>
<li><a class="dropdown-item" href="#">John Doe</a></li>
</ul>
</div>
</template>
<script>
export default {
name: 'MyDropdown',
props: {
label: String,
usersData: Object
}
}
</script>
Пока присутствует v-if="usersData.length
, я получаю эту ошибку в консоли:
Невозможно прочитать свойства неопределенного (чтение «длина»)
Прежде всего, если вы просто избегаете своей ошибки в компоненте внука MyDropDown
, вы можете просто добавить ?
после переменной userData, например v-if="usersData?.length"
. Это устранит вашу ошибку Can't read length of undefined
.
Далее вы пытаетесь передать свои реквизиты от родителя к дочернему компоненту. Вы передаете свои users
данные в usersData
prop тега компонента Filters
, но пытаетесь получить свойства как filterData
в компоненте, что не будет работать должным образом. Таким образом, users
считается со значением undefined
и совпадает с вашим внуком, что вызывает ошибку в вашем внуке, то есть компоненте MyDropDown
.
Попробуйте правильно сопоставить имена свойств и избегайте повторения имен переменных с именами свойств внутри любого компонента.
Если вы пытаетесь отправить данные от родителя к внуку напрямую, вы используете функцию Provide/Inject
Vue.js.
Подробнее об этом читайте здесь Обеспечить/внедрить | Vue.js
Спасибо за уместные замечания, я исправил проблему filterData
. Я не настаиваю на передаче переменной от родителя к внуку напрямую, я просто хочу, чтобы она была во внуке самым простым и полным способом.
Пожалуйста, помогите мне с этот вопрос тоже. Спасибо!
v-if="usersData?.length > 0"
попробуй это или
v-if="usersData.length > 0"