vue 组件之间的传值

  1. 父组件给子组件传值
  • 在父组件中的子组件上绑定属性,在子组件里面接受传值(props)

  • 传值、传对象、传方法

  • 可在接受传值的时候,规定传值的类型

例1:父组件为APP.vue,子组件为Home.vue
App.vue:

<template>
  <div id="app">
   <div class="par_b">
      <p>{{msg}}</p>
      <v-home :title="toHome" :tobool="ishow" :tofun="getchild"></v-home>
   </div>
  </div>
</template>

<script>
import Home from './Components/Home.vue';
export default {
  name: 'app',
  components:{
    'v-home':Home
  },
  data () {
    return {
      msg:"我是根组件",
      toHome:"测试父组件和子组件的传值",   //传值
      ishow:true   
    }
  },
  methods:{
    //传方法
    getchild(){
      console.log(1);
    }
  }
}
</script>

Home.vue:

<template>
    <div id="home">
        <p>{{msg}}</p>
        <p>{{title}}</p>
        <p>{{tobool}}</p>
    </div>
</template>

<script>
export default {
    name:'home',
    props:{
        //对于传来的值进行校验
        'title':String,  
        'tobool':Boolean,
        'tofun':Function
    },
    //基本方式
    //props:['title','tobool','tofun'],
    mounted(){
        this.tofun();
    },
    data(){
        return{
            msg:"我是home组件"
        }
    }
}
</script>

总结:子组件可以通过props属性获取父组件传递的值和方法

  1. 子组件给父组件传值

问题一:

Q:父组件如何使用子组件里的属性和方法?
A:使用ref(ref获取虚拟dom元素节点,可在父组件里获取子组件里的整个对象,利用“对象.属性”和“对象.方法”进行使用)。因此在父组件中的子组件上定义ref属性,通过 this.$ refs.name.属性或this.$refs.name.方法

例2:在例1基础上

App.vue:

<template>
  <div id="app">
   <div class="par_b">
      <p>{{msg}}</p>
      <v-home ref="homedata" :title="toHome" :tobool="ishow" :tofun="getchild"></v-home> 
      <button @click="getchildMsg">获取home组件的属性和方法</button>
   </div>
  </div>
</template>

<script>
import Home from './Components/Home.vue';
export default {
  name: 'app',
  components:{
    'v-home':Home,
  },
  data () {
    return {
      msg:"我是根组件",
      toHome:"测试父组件和子组件的传值",
      ishow:true
    }
  },
  methods:{
    getchild(){
      console.log(1);
    },
    getchildMsg(){
      //通过虚拟dom节点获取整个子组件对象
      let homelist=this.$refs.homedata;
      console.log(homelist);
    }
  }
}
</script>

问题二:

Q:子组件如何获取父组件的整个对象(子组件主动获取父组件的属性和方法)?
A:法一:在父组件中的子组件上定义:parent=“this” ,在子组件中通过props获取parent(类似于父组件给子组件传值,子组件通过props获取父组件传的值)

法二:子组件里直接获取父组件
使用this.$ parent.数据和this.$parent.方法

例3(法一):在例2基础上

App.vue:

<template>
  <div id="app">
   <div class="par_b">
      <p>{{msg}}</p>
      <v-home ref="homedata" :parent="this" :title="toHome" :tobool="ishow" :tofun="getchild"></v-home> 
      <button @click="getchildMsg">获取home组件的属性和方法</button>
   </div>
  </div>
</template>

<script>
import Home from './Components/Home.vue';
export default {
  name: 'app',
  components:{
    'v-home':Home
  },
  data () {
    return {
      msg:"我是根组件",
      toHome:"测试父组件和子组件的传值",
      ishow:true
    }
  },
  methods:{
    getchild(){
      console.log(1);
    },
    getchildMsg(){
      //通过虚拟dom节点获取整个子组件对象
      let homelist=this.$refs.homedata;
      console.log(homelist);
    }
  }
}
</script>

Home.vue:

<template>
    <div id="home">
        <p>{{msg}}</p>
        <p>{{title}}</p>
        <p>{{tobool}}</p>
    </div>
</template>
<script>
export default {
    name:'home',
    props:['title','tobool','tofun','parent'],
    mounted(){
        this.tofun();
        console.log(this.parent.ishow);
    }, 
    data(){
        return{
            msg:"我是home组件"
        }
    }
}
</script>

例4(法二):在例2基础上

Home.vue:

<template>
    <div id="home">
        <p>{{msg}}</p>
        <p>{{title}}</p>
        <p>{{tobool}}</p>
    </div>
</template>
<script>
export default {
    name:'home',
    props:['title','tobool','tofun'],
    mounted(){
        this.tofun();
        console.log(this.$parent);
    }, 
    data(){
        return{
            msg:"我是home组件"
        }
    }
}
</script>
<style lang="scss">

</style>
  1. 非父组件之间传值

不建议使用子父间的传值,使用vue里面的全局广播,即事件的监听

例5:List.vue给Home.vue传值

  • 建立一个与Home.vue同级的组件,名为List.vue ;

  • 要做广播,需建一个全局文件(在src里新建一个名为Emit的文件夹,在该文件夹里新建一个名为Emit.js的文件);

  • 在Emit.js里实例化vue对象;

  • 将对象进行暴露。

整个vue环境里就一个new vue,这个new vue就是进行全局广播

Emit.js:

//实例化vue对象
//导入vue 
import Vue from 'vue';
let emit=new Vue();
//将emit暴露出去
export default emit;
  • 在哪里广播,在其上导入vue的全局对象;
import Emit from '../Emit/Emit.js'

:广播和接收广播都需导入

  • 在List.vue中触发广播;

List.vue:

<template>
    <div id="list">
        <p>{{msg}}</p>
        <!-- 
            List组件给Home组件传值  广播  (非父之间传值,这里的非父指两组件为同级关系)
         -->
         <button @click="sendhome">给home组件传值</button>
    </div>
</template>
<script>
//导入vue的全局对象
import Emit from '../Emit/Emit.js';
export default {
    name:'list',
    data(){
        return{
            msg:"我是list组件",
            tohome:"接受list广播"
        }
    },
    methods:{
        sendhome(){
            //触发广播  tohomedata相当于事件,一种类型
            Emit.$emit("tohomedata",this.tohome);
        }
    }
}
</script>
  • 接收非父组件之间的广播传值

Home.vue:

<template>
    <div id="home">
        <p>{{msg}}</p>
    </div>
</template>
<script>
import Emit from '../Emit/Emit.js';
export default {
    name:'home',
    mounted(){
        //接收非父组件之间的广播传值  监听tohomedata
        Emit.$on("tohomedata",(res)=>{
            console.log(res);
        });
    }, 
    data(){
        return{
            msg:"我是home组件"
        }
    }
}
</script>
  • 传来的值需打印上去进行绑定

Home.vue:

<template>
    <div id="home">
        <p>{{msg}}</p>
        <p>{{listdata}}</p>
    </div>
</template>
<script>
import Emit from '../Emit/Emit.js';
export default {
    name:'home',
    mounted(){
        //接收非父组件之间的广播传值  监听tohomedata
        Emit.$on("tohomedata",(res)=>{
            this.listdata=res;
        });
    }, 
    data(){
        return{
            msg:"我是home组件",
            listdata:null
        }
    }
}
</script>

例6(在例5的基础上):Home.vue给List.vue传值

  • 在Home.vue中触发广播

Home.vue:

<template>
    <div id="home">
        <p>{{msg}}</p>
        <p>{{listdata}}</p>
        <button @click="sendtolist">给list组件广播</button>
    </div>
</template>
<script>
import Emit from '../Emit/Emit.js';
export default {
    name:'home',
    mounted(){
        //接收非父组件之间的广播传值  监听tohomedata
        Emit.$on("tohomedata",(res)=>{
            this.listdata=res;
        });
    }, 
    data(){
        return{
            msg:"我是home组件",
            tolist:"接受home广播",
            listdata:null
        }
    },
    methods:{
        sendtolist(){
            //触发广播
            Emit.$emit("tolistdata",this.tolist);
        }
    }
}
</script>
  • 接收非父组件之间的广播传值

List.vue:

<template>
    <div id="list">
        <p>{{msg}}</p>
        <p>{{giveme}}</p>
         <button @click="sendhome">给home组件传值</button>
    </div>
</template>
<script>
import Emit from '../Emit/Emit.js';
export default {
    name:'list',
    data(){
        return{
            msg:"我是list组件",
            tohome:"接受list广播",
            giveme:null
        }
    },
    mounted(){
        Emit.$on("tolistdata",(res)=>{
            this.giveme=res;
        });
    },
    methods:{
        sendhome(){
            //触发广播  tohomedata相当于事件,一种类型
            Emit.$emit("tohomedata",this.tohome);
        }
    }
}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值