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

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

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. Tcl/Tk语言学习------拆分字符串

    字符串的拆分 前言 字符串的处理是每种语言经常会遇到的问题,tcl作为一门脚本语言自然也不例外,关于字符串的拆分,一般会有两种情况:1.使用单个字符拆分,2.使用字符串拆分. 1.使用单个字符拆分字符 ...

  2. autoResizing autoLayout和sizeClass

    原文网址: http://www.cnblogs.com/cxbblog/p/4166876.html 1. autoResizing autoresizing是苹果早期的ui布局适配的解决办法,iO ...

  3. 笔记-JavaWeb学习之旅9

    XML Extensible Markup Language 可扩展标记语言 功能:配置文件,在网络中传输 基本语法 1.xml文档的后缀名.xml 2.xml第一行必须定义为文档声明 3.xml文档 ...

  4. 第一篇 Nosql讲解之Redis,Memchche,MongoDb的区别

    本篇文章主要介绍Nosql的一些东西,以及Nosql中比较火的三个数据库Redis.Memchache.MongoDb和他们之间的区别.以下是本文章的阅读目录 一.Nosql介绍 1.Nosql简介 ...

  5. AVL树(自平衡二叉查找树)

    了解AVL树之前要先了解二叉查找树(BST),BST查找元素的时间复杂度平均是O(logN),最坏的情况是O(N),所有的元素都接在左子树(或者右子树)就相当于一串链表了.而AVL树会对子树过高的情况 ...

  6. layui 单选框选中事件

    <div class="layui-form-item" pane=""> <label class="layui-form-lab ...

  7. jmeter diff测试(调用JAR包处理)

    1.准备接口数据(对比字段,即json数据中需要提取的key对应的值进行对比) 2.配置获取EXCEL数据 3.新建线程,并建两个http请求,分别用于请求新旧接口 4.提取需要对比的内容 5.赋值变 ...

  8. HTML 5的革新——语义化标签(一)HTML 5的革新——语义化标签(二)

    HTML 5的革新之一:语义化标签一节元素标签. 在HTML 5出来之前,我们用div来表示页面章节,但是这些div都没有实际意义.(即使我们用css样式的id和class形容这块内容的意义).这些标 ...

  9. lowbit

    树状数组(lowbit) Time Limit:1000ms   Memory Limit:128MB 题目描述 这天,LYK在学习树状数组. 当它遇到一个叫lowbit的函数时有点懵逼.lowbit ...

  10. 绘制复杂的原理图元件和pcb封装库用于cadence(一)

    绘制TI公司的TPS53319电源芯片封装 由于产品设计需要大电流电源供电,选用TI公司TPS53319电源芯片通过cadence软件进行电路设计,但是TI公司所提供的封装格式为CAD File(.b ...