vue3 复杂的多页面之间的传值和获取值
3个页面之间互相传值,取值
app.vue(父级页面)
first.vue(子级页面)
second.vue(子级页面)
先声明页面情况:把数据定义在app.vue(父级)中,first.vue(子级)需要拿到定义在app.vue(父级)中的数据,second.vue(子级)需要通过app.vue(父级)来到拿到first.vue(子级,和second.vue是兄弟【同级】)中点击的某一个元素
app.vue(父级)中
<template>
<first :resourceChild="resource" @fatherHomeClick="selectResource"></first>
<second :detialsResource="selectedResource"></second>
</template>
<script>
import{toRefs,reactive} from "vue"
import first from "first.vue的路径"
importsecond from" second.vue的路径"
export default{
components:{
first,
second
},
setup(){
const data= reactive({
})
这里的数据就是用来接收子级first.vue中传递过来的数据
return{ .../toRefs(data),selectedResource,selectResource }
}
}
</script>
注释:
1. :resourceChild="resource" 详解::resourceChild是传给子级first.vue,因为在app.vue中进行了声明resource是数据名,所以这句话的意思就是通过:resourceChild把数据传递到first.vue中; @fatherHomeClick="selectResource"中@fatherHomeClick是子级中定义注册的一个点击事件,这个是点击事件的名称,selectResource是app.vue中的一个点击事件,后面不能接()
2. :detialsResource="selectedResource"详解: :detialsResource是绑定属性的形式传值,selsectedResource是父级中定义的,而detialsResources是在子级中进行接收的
3. 因为数据要解包,所以用到toRefs,需要在app.vue的顶部进行引用
4. 因为要写数据,所以需要用到reactive,也是需要在app.vue的顶部进行引用
first.vue(是app.vue的子级,是first.vue的兄弟【同级】)中
<template>
</template>
<script>
<script>
注释:
1. props:{resourceChild:{}} 详解:props是用来接收父级传入的值得,而resourceChild是用来接收值得名称,这里的resourceChild是不能随意起名字的,需要同父级绑定的名称一样才可以,当拿到数据后,就可以对数据拆分,拿到自己想要的数据。但是这个里拿到的数据还是一个数组的形式,当数据多条的时候可以采用v-for循环来获取对应的数据
2.<li v-for=" item in resourceChild" :key="item._id" @click="onItemClick(item)" class="list-group-item d-flex justify-content-between bg-light resource-list-item"> 详解:当拿到数据的resourceChild,是一个数组,通过v-for循环的方式来展现出每一条数据,item in resourceChild就是来循环出每一条数据的,而现在的每一条数据就是用item来代替,所以当id获取的方式就是item._id,@click = onItemClick(item),这里为什么是传的item ,因为是的点击事件是为了要清楚的知道点击的是哪一个/那一条,就要传点击事件的本身(对象),所以是item,当进行事件注册的时候,是方便数据在app.vue中进行中转传入到second.vue中进行展示
second.vue(是app.vue的子级,是first.vue的兄弟【同级】)
<template>
</template>
<script>
<script>
注释:
1.props :{detialsResource:{}}详解: props是用来接收数据的。接收从父级 selectedResource处获取的数据,在通过属性绑定的形式传递给detialsResource,然后根据对应的展示,展示出id,type ,description...
2.进行了一次判断v-if和v-else 因为在没有点击的情况下左侧是空的,所以进行一次传值点击之前的判断,判断!detialsResource的id有没有,当没有情况下给出提示,当点击之后,有id的时候就正常显示
本段难点:
1。通过中转的方式来拿到数据,也就是常说的兄弟页面之间怎么获取,或者是传值,(其实就是通过a传B传c,中间的B就是父级,a和c都是子级,也是彼此的兄弟)就是在a中注册事件,传给B,在B中进行中转赋值,属性绑定在传给c
2。子级获取父级的元素(数据),父级通过绑定,子级通过props来接收