vue父子传值的具体应用
最近我负责的项目已经迭代到第四版了,我作为一个没啥经验的小菜鸟也成长了很多。
在这一版开发开始之前,我老大就要求我在开发过程中尽量实现组件化,因此,我也遇到了很多问题,但基本都解决了,所以趁周末把这些经验总结一下。
Vue中父子组件传值的方法大体上可以分为2类:
1. 通过第三方转接,比如vuex,eventbus以及浏览器的localStorage,sessionStorage等;
2. 父子组件之间直接进行数据交换
第一种方法我用的比较多的就是vuex 以及localStorage,sessionStorage,需要注意的一点是vuex中数据改变最好使用mutation进行提交。
这次主要说说我使用第二种方法遇到的一些问题以及解决方法。
首先父子组件传值有3种写法
第一种,如果传入值是一个静态变量,可以直接在标签上写:变量名=值,这样写只能算是单向数据绑定。
父组件:
<template>
<div>
<child msg="一条消息"></child>
</div>
</template> <script>
import child from './child'
export default {
components:{
child
}
}
</script>
子组件在props中进行接收
子组件:
<template>
<div>
<p>{{msg}}</p>
</div>
</template> <script>
export default {
props: ["msg"]
};
</script>
第二种,也是最常用的一种,在标签上使用:或者v-bind进行数据绑定,子组件还是用props接收,如果想要更改数据,需要在父组件中定义更改数据的函数,然后用v-on或者@绑定到子组件上,子组件中使用this.$emit(方法名字符串,唯一参数)的方式调用。
这种方法最常见,也用的最多,所以就不再贴代码了。
第三种,使用v-model进行数据绑定
父组件:
<template>
<div>
<child msg="一条消息" v-model="number"></child>
</div>
</template> <script>
import child from "./child";
export default {
components: {
child
},
data() {
return {
number: 1,
flag: false
};
}
};
</script>
子组件:
<template>
<div>
<p>{{msg}}</p>
<p>{{number}}</p>
<button @click="change">number+1</button>
</div>
</template> <script>
export default {
model: {
prop: "number", //变量名
event: "aa" //自定义的事件名
},
props: {
msg: String,
number: Number
},
methods: {
change() {
this.$emit("aa", this.number + 1);
}
}
};
</script>
v-model还有一种写法,就是在子组件中默认的变量value进行变量接收,父组件写法不变
子组件:
<template>
<div>
<p>{{msg}}</p>
<!-- <p>{{number}}</p> -->
<p>{{value}}</p>
<button @click="change">number+1</button>
</div>
</template> <script>
export default {
//model: {
// prop: "number", //变量名
// event: "aa" //自定义的事件名
//},
props: {
msg: String,
value: Number //接收number
},
methods: {
change() {
// this.$emit("aa", this.number + 1);
this.$emit("input", this.value + 1); //必须使用默认的input事件进行变量更改提交
}
}
};
</script>
这种写法的优势在于,如果你需要父组件传一个简单的变量给子组件,并且需要父子组件同步修改,可以省略掉父组件v-on绑定给子组件的函数
mint-ui中popup组件中控制组件显示与隐藏就是用的这种方法。
但是父组件不会总是传递一个简单的基本变量给子组件,很多情况是父组件传一个对象或者数组,或者对象、数组嵌套的变量给子组件,子组件使用v-for循环渲染出一个列表,
并且列表项上会有一些可点击的部分,用来更改相应的数据,这时候,如果要父组件为每一个修改数据的行为都写一个函数,并且用v-on绑定到子组件上,那么当我在其他页面也用到这个组件,又要把这些函数拿到另外一个文件中,实在是不方便,且不优雅。
这个时候我们就要考虑在子组件data中定义一个变量,然后把props中接收得到的变量赋值给data,这样我们所有的函数就都可以写到子组件中了。
子组件参考:
<template>
<div>
<p>{{msg}}</p>
<!-- <p>{{number}}</p> -->
<p>{{value}}</p>
<button @click="change">number+1</button> <div v-for="(item,index) in list" :key="index">
<p @click="changeItemInfo(index)">{{item.a}}</p>
<p>{{item.b}}</p>
<p>{{item.c}}</p>
<p>{{item.d}}</p>
</div>
</div>
</template> <script>
export default {
//model: {
// prop: "number", //变量名
// event: "aa" //自定义的事件名
//},
props: {
msg: String,
value: Number, //接收number
contentList: Array
},
data() {
list: [];
},
watch: {
contentList: {
immediate: true,
handler(newVal, oldVal) {
if (newVal) {
this.list = this.contentList;
}
}
}
},
methods: {
change() {
// this.$emit("aa", this.number + 1);
this.$emit("input", this.value + 1); //必须使用默认的input事件进行变量更改提交
},
changeItemInfo(index) {
this.$set(this.list[index], "a", "aaa"); //建议使用this.$set()提交数组或对象中的更改,否则嵌套比较深的数据更改了,视图有可能无法更新
}
}
};
</script>
vue父子传值的具体应用的更多相关文章
- 10.4 Vue 父子传值
简单示例 APP.vue <template> <div> <img :src="imgSrc"> <!-- 父子传值 --> &l ...
- Vue父子传值
昨天创建完项目以后,今日首先使用项目来做一个简单的导航栏体会一下Vue的使用 1.项目的结构: 2.首先在Vheader.Vue中编辑代码: <template> <header c ...
- day 100天 VUE 父子传值,单页面.
一 .静态资源导入方法 启动服务 npm run serve <template> <div id ="app"> <h3>{{msg}}& ...
- vue父子传值与非父子传值
大概梳理下传值的几种方式 一:父子组件传值 props方式 子组件对外暴露方法并向父组件传递由于触发方法导致的值的变化,父组件接收子组件传递来的值:子组件接收父组件传递来的值,并根据传递来的值在子组件 ...
- vue 父子传值,子页面没有实时刷新的问题
在做高德地图的时候,发现列表点击编辑的时候,地图不能实时更新: <el-form-item label="门店坐标:" :label-width="formLabe ...
- vue——父子传值
转载地址:https://blog.csdn.net/xr510002594/article/details/83304141
- vue父子组件之间传值
vue父子组件进行传值 vue中的父子组件,什么是父组件什么是子组件呢?就跟html标签一样,谁包裹着谁谁就是父组件,被包裹的元素就是子组件. 父组件向子组件传值 下面用的script引入的方式,那种 ...
- vue父子组件的传值总结
久违的博客园我又回来了.此篇文章写得是vue父子组件的传值,虽然网上已经有很多了.写此文章的目的就是记录下个人学习的一部分.接下来我们就进入主题吧! 在开发vue项目中,父子组件的传值是避免不掉的. ...
- vue父子组件传值加例子
例子:http://element-cn.eleme.io/#/zh-CN/component/form 上进行改的 父传子:用prop:子组件能够改变父组件的值,是共享的,和父操作是 ...
随机推荐
- js中 call() ,apply(),bing()方法三者的用法和区别
面试中经常会被问到的,或者做笔试题的时候也会有这样的问题,所以今天专门对这个问题做个总结: 先看个例子: var age = '19' var myObj = { name:'小赖', myAge:t ...
- iOS 7 隐藏特性
当 iOS7 刚发布的时候,全世界的苹果开发人员都立马尝试着去编译他们的app,接着再花上数月的时间来修复任何出现的故障,甚至重做app.这样的结果,使得人们根本无暇去探究 iOS7 所带来的新东西. ...
- 笔记-JavaWeb学习之旅8
Window对象-定时器方法 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- JAVA实训总结 :String
String是特殊的类,与其他基本类型并不相同,是被java封装的类型 String底层组成对象为数组与字典(字符集编码表) String 类型的字符串是存储在JVM特别开辟的字符串常量池中 创建 ...
- tensorflow:实战Google深度学习框架第四章02神经网络优化(学习率,避免过拟合,滑动平均模型)
1.学习率的设置既不能太小,又不能太大,解决方法:使用指数衰减法 例如: 假设我们要最小化函数 y=x2y=x2, 选择初始点 x0=5x0=5 1. 学习率为1的时候,x在5和-5之间震荡. im ...
- kibana通过nginx配置访问用户验证
背景: 现在搭建好了efk,其中kibana是可以在网页上访问的可视化工具,搭建好的kibana默认没有访问控制权限,任何人都能访问,这样存在一些安全隐患和隐私问题.这里我把设置的访问验证过程记录一下 ...
- Thinking In Java持有对象阅读记录
这里记录下一些之前不太了解的知识点,还有一些小细节吧 序 首先,为什么要有Containers来持有对象,直接用array不好吗?——数组是固定大小的,使用不方便,而且是只能持有一个类型的对象,但当你 ...
- 102 Binary Tree Level Order Traversal 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值. (即zhu'ceng'de,从左到右访问).例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 ...
- kafka基础五
Kafka与Zookeeper Zookeeper存储了什么 kafka架构中角色: 1.producer: 消息生产者,发布消息到 kafka 集群的终端或服务. 2.broker: kafka 集 ...
- substring和substr,slice和splice
substring 和 substr 这二货都是针对字符串而言的,且都是返回一个副本,而不是在原字符串上直接操作. 上代码: var str = '0123456789'; console.log( ...