详解Vue的七种传值方式


Posted in Vue.js onFebruary 08, 2021

1,父传子

子组件中定义props字段,类型为数组(如果需要限制字段值类型,也可以定义为对象的形式)。如下图的例子,父组件挂载子组件HelloWorld,在组件标签上给title赋值,子组件HelloWorld定义props,里面有一个值是title,这样子组件就可以使用父组件的值了。

父组件

<template>
 <div>
 <HelloWorld :title="msg" />
 </div>
</template>

<script>
import HelloWorld from "../components/HelloWorld.vue";

export default {
 name: "Home",
 data() {
 return {
  msg: "搜索音乐",
 };
 },
 components: {
 HelloWorld,
 },
};
</script>

子组件

<template>
 <div class="hello">
 <h1>{{ title }}</h1>
 </div>
</template>

<script>
export default {
 name: "HelloWorld",
 props:["title"],
 data() {
 return {};
 },
};
</script>

2,子传父

子传父,需要在子组件中触发一个事件,在事件中,调用$emit('父组件的方法名', '传递的值'),然后在父组件中,通过自定义事件接收传递过来的值。

子组件

<template>
 <div class="hello">
 <h1 @click="add">{{ title }}</h1>
 </div>
</template>

<script>
export default {
 name: "HelloWorld",
 props: ["title"],
 data() {
 return {
  age:18
 };
 },
 methods: {
 add(){
  this.$emit("childEvent", this.age);
 }
 },
};
</script>

父组件

<template>
 <div>
 <HelloWorld @childEvent="parentEvent" :title="msg" />
 </div>
</template>

<script>
import HelloWorld from "../components/HelloWorld.vue";

export default {
 name: "Home",
 data() {
 return {
  msg: "搜索音乐",
 };
 },

 methods: {
 parentEvent(e) {
  console.log(e);
 },
 },
 components: {
 HelloWorld,
 },
};
</script>

3,兄弟组件传值

1,先新建一个bus.js文件,在bus.jsnew一个Vue实例,充当传输数据的中间层。

import Vue from 'vue';
export default new Vue;

2,在组件A中引入bus.js,通过bus.$emit('事件名','参数')传递参数

<template>
 <div class="hello">
 <h1 @click="add">{{ title }}</h1>
 </div>
</template>

<script>
import bus from "../publicFn/bus.js";

export default {
 name: "HelloWorld",
 props: ["title"],
 data() {
 return {
  age:18
 };
 },
 methods: {
 add(){
  bus.$emit("childEvent", this.age);
 }
 },
};
</script>

3,在B组件mounted周期中使用$on('事件名', function(){})接收

<template>
 <div id='swiper'>
 <button>我是按钮</button>
 </div>
</template>

<script>

import bus from "../publicFn/bus.js";

export default {
 name:'Swiper',
 data (){
 return {

 }
 },
 mounted(){
 bus.$on("childEvent", (e) => {
  console.log(e)
 })
 }
}
</script>

4,父组件使用子组件的数据和方法

1,在子组件标签上写上ref属性

2,父组件通过this.$refs.id.方法名或者this.$refs.id.属性名的方式可以访问子组件。

父组件

<template>
 <div>
 <HelloWorld :title="msg" ref="hello" />
 <button @click="parentEvent">我是父亲</button>
 </div>
</template>

<script>
import HelloWorld from "../components/HelloWorld.vue";

export default {
 name: "Home",
 data() {
 return {
  msg: "搜索音乐",
 };
 },

 methods: {
 parentEvent() {
  this.$refs.hello.add();
  console.log(this.$refs.hello.age);
 },
 },
 components: {
 HelloWorld
 },
};
</script>

子组件

<template>
 <div class="hello">
 <h1>{{ title }}</h1>
 </div>
</template>

<script>
export default {
 name: "HelloWorld",
 props: ["title"],
 data() {
 return {
  age:18
 };
 },
 methods: {
 add(){
  console.log("我是子组件");
 }
 },
};
</script>

5,子组件使用父组件的数据和方法

在子组件中,可以使用$parent访问其上级父组件的数据和方法,如果是多重嵌套,也可以使用多层$parent

父组件

<template>
 <div>
 <HelloWorld :title="msg" ref="hello" />
 </div>
</template>

<script>
import HelloWorld from "../components/HelloWorld.vue";

export default {
 name: "Home",
 data() {
 return {
  msg: "搜索音乐",
 };
 },

 methods: {
 parentEvent() {
  console.log("我是父组件的方法");
 },
 },
 components: {
 HelloWorld
 },
};
</script>

子组件

<template>
 <div class="hello">
 <h1 @click="add">{{ title }}</h1>
 </div>
</template>

<script>
export default {
 name: "HelloWorld",
 props: ["title"],
 data() {
 return {
  age:18
 };
 },
 methods: {
 add(){
  console.log(this.$parent.msg)
  this.$parent.parentEvent();
 }
 },
};
</script>

6,Vuex传值

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。一般小项目不需要用到。

6.1,定义store

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store({
 state: {
 school: "清华大学",
 a:"nice"
 },
 getters: {
 returnVal(state) {
  return state.school + state.a;
 },
 },
 mutations: {
 changeSchool(state, val) {
  state.school = val;
  console.log('修改成功');
 },
 },
 actions: {},
 modules: {}
});

6.2,挂载

import Vue from 'vue';
import App from './App.vue';
import router from "./router";
import store from "./store";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
import publicFn from "./publicFn/publicFn";

Vue.config.productionTip = false


const url = process.env.VUE_APP_URL;
Vue.prototype.$url = url;
Vue.prototype.$publicFn = publicFn;

Vue.use(ElementUI);

new Vue({
 router,
 store,
 render: h => h(App),
}).$mount('#app')

6.3,使用

<template>
 <div class="hello">
 <h1 @click="add">{{ title }}</h1>
 </div>
</template>

<script>
export default {
 name: "HelloWorld",
 props: ["title"],
 data() {
 return {
  age:18
 };
 },
 methods: {
 add(){
  console.log(this.$store.state.school);//获取值
  //this.$store.commit('changeSchool', '北京大学');//修改值
  // console.log(this.$store.getters.returnVal)//获取过滤后的值
 }
 },
};
</script>

7,路由传值

7.1 通过query传值

注意:该方式刷新页面参数不丢失,并且会在地址栏后将参数显露,http://localhost:9000/#/conter?id=10086&name=%E9%B9%8F%E5%A4%9A%E5%A4%9A

页面A

<template>
 <div>
 <HelloWorld :title="msg" ref="hello" />
 <button @click="parentEvent">跳转</button>
 </div>
</template>

<script>
import HelloWorld from "../components/HelloWorld.vue";

export default {
 name: "Home",
 data() {
 return {
  msg: "搜索音乐",
 };
 },

 methods: {
 parentEvent() {
  this.$router.push({
  path:"/conter",
  name:'conter',
  query:{
   id:10086,
   name:"鹏多多"
  }
  })
 },
 },
 components: {
 HelloWorld
 },
};
</script>

页面B

<template>
 <div id='conter'>

 </div>
</template>

<script>

export default {
 name:'conter',
 data (){
 return {

 }
 },
 created (){
 console.log(this.$route.query.id, this.$route.query.name);
 },
}
</script>

7.2 通过params传值

注意:该方式刷新页面参数会丢失,可以接收后存在sessionStorage

A页面

<template>
 <div>
 <HelloWorld :title="msg" ref="hello" />
 <button @click="parentEvent">跳转</button>
 </div>
</template>

<script>
import HelloWorld from "../components/HelloWorld.vue";

export default {
 name: "Home",
 data() {
 return {
  msg: "搜索音乐",
 };
 },

 methods: {
 parentEvent() {
  this.$router.push({
  path:"/conter",
  name:"conter",
  params:{
   id:10086,
   name:"鹏多多"
  }
  })
 },
 },
 components: {
 HelloWorld
 },
};
</script>

B页面

<template>
 <div id='conter'>

 </div>
</template>

<script>

export default {
 name:'conter',
 data (){
 return {

 }
 },
 created (){
 console.log(this.$route.params.id, this.$route.params.name);
 },
}
</script>

到此这篇关于Vue的七种传值方式的文章就介绍到这了,更多相关Vue传值方式内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue在图片上传的时候压缩图片
Nov 18 Vue.js
详解Vue3 Teleport 的实践及原理
Dec 02 Vue.js
vue中利用three.js实现全景图的完整示例
Dec 07 Vue.js
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 Vue.js
在vue项目中封装echarts的步骤
Dec 25 Vue.js
vue3+typeScript穿梭框的实现示例
Dec 29 Vue.js
vue登录页实现使用cookie记住7天密码功能的方法
Feb 18 Vue.js
vue引入Excel表格插件的方法
Apr 28 Vue.js
Vue项目中如何封装axios(统一管理http请求)
May 02 Vue.js
Vue过滤器(filter)实现及应用场景详解
Jun 15 Vue.js
vue使用refs获取嵌套组件中的值过程
Mar 31 Vue.js
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 Vue.js
Vue中使用wangeditor富文本编辑的问题
Feb 07 #Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 #Vue.js
vue如何使用rem适配
Feb 06 #Vue.js
如何管理Vue中的缓存页面
Feb 06 #Vue.js
手动实现vue2.0的双向数据绑定原理详解
Feb 06 #Vue.js
vue3.0 自适应不同分辨率电脑的操作
Feb 06 #Vue.js
vue使用echarts画组织结构图
Feb 06 #Vue.js
You might like
一些使用频率比较高的php函数
2008/10/03 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
2014/05/12 PHP
php socket客户端及服务器端应用实例
2014/07/04 PHP
9段PHP实用功能的代码推荐
2014/10/14 PHP
php上传文件常见问题总结
2015/02/03 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
JavaScript打字小游戏代码
2011/12/26 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
Python中operator模块的操作符使用示例总结
2016/06/28 Python
python实现简单中文词频统计示例
2017/11/08 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
Python 实现黑客帝国中的字符雨的示例代码
2020/02/20 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
2020/03/09 Python
管理心得体会
2013/12/28 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
2014年电教工作总结
2014/12/19 职场文书
幼儿园大班开学寄语(2016秋季)
2015/12/03 职场文书
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS
python解析json数据
2022/04/29 Python