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

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

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. [Xcode 实际操作]二、视图与手势-(2)UIView视图的层次关系

    目录:[Swift]Xcode实际操作 本文将演示创建三个视图对象,其中第二个视图是第三个视图的父视图. 现在开始编写代码,实现这项功能 import UIKit class ViewControll ...

  2. 2019年最新总结,从程序员到CTO,从专业走向卓越,大牛分享文档pdf与PPT整理

    整理大牛分享文档如下,持续更新一线开发架构,技术文档 github链接 网易蜂巢公有容器云架构之路 新浪微博redis优化历程 微博Cache架构设计实践 Go在大数据开发中的经验总结 基于Go构建滴 ...

  3. 为GitHub项目添加协议

    解决方法 如果一开始在GitHub上创建仓库时没有添加协议,可以用以下方式来重新添加相关的协议: 打开GitHub上的某个仓库,点击Create new file: 在新建文件的页面上,输入文件名LI ...

  4. VC 中TEXT、_T、L的区别

    http://i.cnblogs.com/EditPosts.aspx?opt=1 对于从VC++6.0转到VS2005编译环境中的程序员.往往会碰到字符集之间的转换. VC6.0采用的是ANSI字符 ...

  5. localStorage和sessionStorage使用

    localStorage.setItem("key","value");//存数据 localStorage.getItem("key"); ...

  6. Linux | C代码的编写、运行和调试

    1.  建立.c文件 在终端下输入:vi mytest.c [使用编辑器 vim] 键入键盘i键,使vi编辑器进入编辑模式 接下来在vi编译器中编写代码,如: #include <stdio.h ...

  7. iOS开发:创建推送开发证书和生产证书,以及往极光推送官网上传证书的步骤方法

    在极光官网上面上传应用的极光推送证书的实质其实就是上传导出的p12文件,在极光推送应用管理里面,需要上传两个p12文件,一个是生产证书,一个是开发证书 ,缺一不可,具体如下所示: 在开发者账号里面创建 ...

  8. 2个rman自动恢复的脚本

    ### scripts 1--the scirpt is used for restore db from vcs to a point to time recovery--and the targe ...

  9. java中的线程安全是什么?什么叫线程安全?什么叫不安全?

    java中的线程安全是什么: 就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问 什么叫 ...

  10. LessCss学习笔记

    一.入门 1.LESSCSS是什么? LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编 ...