Vue 基礎 IV.
這裡製作一個樹狀式的選單
v-for 樹狀結構渲染
通常渲染陣列不只一或兩層,有時面對資料龐大時會有三到四層的陣列,最常看見的就是手風琴式的選單上,這時候就必須配合用到props
。
資料架構
js
...
const list=reactive([
{name:'A',
children:[
{title:'a-1',
link:'/a1',
children:[
{title:'a1-1',
children:[
{title:'a1-1-1'}
]}
]},
{title:'a-2',
link:'/a2',
children:[
{title:'a2-1',
children:[
{title:'a2-1-1'}
]}
]},
]
},
{name:'B',
children:[
{title:'b-1',
link:'/b1',
children:[
{title:'b1-1',
children:[
{title:'b1-1-1'}
]}
]},
]
}
])
引入 components
Vue3 的 Components 寫法比 Vue2 方便多了,不須再多餘的宣告,所以兩者會有不同的宣告寫法,要注意。
- 將
Child
標籤引入父層後,必須要給個props
資料 ( item ) 送到子層使用。 - 在子層也需要使用
Child
標籤來引入第2層或更多層。 - 子層需宣告
props
的類型,並在標籤上標示:item
,代表拿取父層給的props
資料。
js
<template>
<Child v-for="item in list" :key="item.name" :item="item"></Child>
</template>
<script setup>
import {reactive} from 'vue'
import Child from './children.vue'
const list=reactive([...])
</script>
js
<template>
...
<a @clickj='isOpen=!isOpen'> {{item.name}}{{ isOpen?"-":"+" }} </a>
...
<div v-if="item.children">
<Child v-show="isOpen" v-for="items in item.children" :key="items.id" :item="items">
</Child>
</div>
</template>
<script setup>
import {ref} from "vue"
const props=defineProps({
item:Object
})
...
const isOpen= ref(false)
...
</script>
提醒
這裡要記住標籤名稱是否正確,否則會出現找不到的情形,再來有遇過.vue檔名必須要駝峰式寫法,否則容易判斷錯誤,出現一樣的問題。