最近我负责的项目已经迭代到第四版了,我作为一个没啥经验的小菜鸟也成长了很多。

在这一版开发开始之前,我老大就要求我在开发过程中尽量实现组件化,因此,我也遇到了很多问题,但基本都解决了,所以趁周末把这些经验总结一下。

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父子传值的具体应用的更多相关文章

  1. 10.4 Vue 父子传值

    简单示例 APP.vue <template> <div> <img :src="imgSrc"> <!-- 父子传值 --> &l ...

  2. Vue父子传值

    昨天创建完项目以后,今日首先使用项目来做一个简单的导航栏体会一下Vue的使用 1.项目的结构: 2.首先在Vheader.Vue中编辑代码: <template> <header c ...

  3. day 100天 VUE 父子传值,单页面.

     一 .静态资源导入方法 启动服务  npm run serve <template> <div id ="app"> <h3>{{msg}}& ...

  4. vue父子传值与非父子传值

    大概梳理下传值的几种方式 一:父子组件传值 props方式 子组件对外暴露方法并向父组件传递由于触发方法导致的值的变化,父组件接收子组件传递来的值:子组件接收父组件传递来的值,并根据传递来的值在子组件 ...

  5. vue 父子传值,子页面没有实时刷新的问题

    在做高德地图的时候,发现列表点击编辑的时候,地图不能实时更新: <el-form-item label="门店坐标:" :label-width="formLabe ...

  6. vue——父子传值

    转载地址:https://blog.csdn.net/xr510002594/article/details/83304141

  7. vue父子组件之间传值

    vue父子组件进行传值 vue中的父子组件,什么是父组件什么是子组件呢?就跟html标签一样,谁包裹着谁谁就是父组件,被包裹的元素就是子组件. 父组件向子组件传值 下面用的script引入的方式,那种 ...

  8. vue父子组件的传值总结

    久违的博客园我又回来了.此篇文章写得是vue父子组件的传值,虽然网上已经有很多了.写此文章的目的就是记录下个人学习的一部分.接下来我们就进入主题吧! 在开发vue项目中,父子组件的传值是避免不掉的. ...

  9. vue父子组件传值加例子

    例子:http://element-cn.eleme.io/#/zh-CN/component/form         上进行改的 父传子:用prop:子组件能够改变父组件的值,是共享的,和父操作是 ...

随机推荐

  1. 【OpenJ_Bailian - 2287】Tian Ji -- The Horse Racing (贪心)

    Tian Ji -- The Horse Racing 田忌赛马,还是English,要不是看题目,我都被原题整懵了,直接上Chinese吧 Descriptions: 田忌和齐王赛马,他们各有n匹马 ...

  2. assembly x86(nasm)画三角形等图形的实现

    参考了一位大佬的博客 https://blog.csdn.net/qq_40298054/article/details/84496944传送门 https://blog.csdn.net/qq_40 ...

  3. C 语言实例 - 二进制与十进制相互转换

    C 语言实例 - 二进制与十进制相互转换 C 语言实例 C 语言实例 二进制转与十进制相互转换. 实例 - 二进制转换为十进制 #include <stdio.h> #include &l ...

  4. struts2学习笔记 day01

  5. Git,SVN的优缺点及适合的范围,开源项目?公司项目?

    Git,SVN的优缺点及适合的范围,开源项目?公司项目? 使用git不久,粗浅理解: 1)适用对象不同.Git适用于参与开源项目的开发者.他们由于水平高,更在乎的是效率而不是易用性.Svn则不同,它适 ...

  6. js模拟冒泡排序动态图(1轮)

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  7. DWR+Spring配置使用

    一.DWR介绍 DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端 ...

  8. python学习之高级特性:

    切片:对列表.元组.字符串.字典取中间的一部分,在C中一般是通过for循环拷贝/memcpy/strcat等操作.而python提供了更方便的切片操作符[m:n]:前闭后开,如果从0取m可以省略:如果 ...

  9. 前端之CSS列表及背景类属性

    一.列表类属性: 1.列表符号样式: list-style-type:disc(实心圆)|circle(空心圆)|square(实心方块)|decimal(数字)|none(去掉列表符号样式); 2. ...

  10. 面向对象-类-成员变量-局部变量-this

    1.能够理解面向对象的思想     面向对象是基于面向过程的编程思想,强调的是对象,由对象去调用功能.它是一种更符合人类习惯的编程思想,可以将复杂的事情简单化,将我们的角色从执行者变成了指挥者. 2. ...