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({
          resource:[
                        {
                            _id:"1",
                            title:"新闻1",
                            description:"新闻新闻",
                            type:"video",
                            link:""
                       },
                       {
                            _id:"2",
                            title:"新闻2",
                            description:"新闻新闻",
                            type:"video2",
                            link:""
                       },
                       {
                            _id:"3",
                            title:"新闻3",
                            description:"新闻新闻",
                            type:"video3",
                            link:""
                       },
                      {
                            _id:"4",
                           title:"新闻4",
                            description:"新闻新闻4",
                            type:"video",
                            link:""
                       },
                       {
                            _id:"5",
                            title:"新闻5",
                            description:"新闻新闻5",
                            type:"video",
                            link:""
                       },
                       {
                            _id:"6",
                            title:"新闻6",
                            description:"新闻新闻6",
                            type:"video",
                            link:""
                       },
                       {
                            _id:"7",
                            title:"新闻7",
                            description:"新闻新闻7",
                            type:"video",
                            link:""
                       }
                  ]
      })

    这里的数据就是用来接收子级first.vue中传递过来的数据

   

const selectedResource = ref(null);
           const  selectResource = (res)  =>{
            //   console.log(res);
              //声明一个变量来接收数据
              selectedResource.value= res;
            };
 
    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>
    <ul class="list-group mb-3 resource-list">
        <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">
            <div class="text-success">
            <h6 class="my-0">{{item.title}}</h6>
            <small class="text-muted">{{item.description}}</small>
            </div>
            <span class="text-muted">{{item.type}}</span>
        </li>
    </ul>
</template>
<script>
   props:{
          resourceChild:{
              type:Array,
              default:[]  //还有一种写法 default ()=>[]
          }
     },
     setup( props,context){
          const onItemClick = (item)=>{
              context.emit("fatherHomeClick",item);
          };
          return{onItemClick};
     }
<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>

<!-- 这里进行了一次判断v-if和v-else 因为在没有点击的情况下左侧是空的,所以进行一次传值点击之前的判断,判断!detialsResource的id有没有,当没有情况下给出提示,当点击之后,有id的时候就正常显示 -->

       

<div class="card" v-if="!detialsResource?._id">
                <div class="card-body">
                    No detialsResource is select 
                </div>
            </div>
          <div v-else class="card">
            <div class="card-header">{{detialsResource.title}}</div>
            <div class="card-body">
              <blockquote class="blockquote mb-0">
                <p>{{detialsResource.description}}</p>
                <footer class="text-muted mb-2">{{detialsResource.type}}</footer>
              </blockquote>
              <a href="#" class="btn btn-primary">编辑</a>
            </div>
          </div>
</template>
<script>
export default {
   props :{
       detialsResource:{
           validator:(prop) => typeof prop ==="object" || prop ===null,
           required: true,
       }
   }
}
<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来接收