概述
每一个vue 文件就是一个 组件,组件和组件相互组合,就成了一个应用,这就涉及到的组件和组件之间的通信,最常用的就是父子之间的通信。在vue 中, 在一个组件中通过 import 引入另一个组件,这个组件就是父组件,被引入的组件就是子组件。
在vue-cli 项目中,src 文件夹下有一个Appvue 文件,它的script标签中,import Hello from '/components/Hello',那么Appvue 就是父组件,components 文件夹下的Hellovue 就是子组件。父组件通过props 向子组件传递数据,子组件通过自定义事件向父组件传递数据。
父------子
父组件向子组件传值, 它主要是通过元素的属性进行的 在Appvue 的template中,有一个, 这就是我们引入的子组件 给其添加属性如mes-father="message from father"; 父组件将数据传递进去,子组件需要接收才能使用 怎样接收呢
在Hellovue 中, export default 后面的对象中,添加一个字段props, 它是一个数组, 专门用来接收父组件传递过来的数据 props: ["mesFather"], 这里定义了mesFather 字符串, 和父组件中定义的元素的属性一一对应
注意: 在父组件,就是在 元素中定义的属性是mes-father, 没有一一对应啊 这主要是因为,在html 元素中大小写是不敏感的。 如果我们写成, 里面的mesFather 就会转化成mesfather, 相当于我们向子组件传递了一个mesfather数据, 如果在js 文件中,我们定义props: ["mesFather"],我们是接受不到数据的,因为js 是区分大小写的, 只能写成props: ["mesfather"] 但是在js 文件中,像这种两个单词拼成的数据,我们习惯用驼峰命名法,所以vue 做了一个转化,如果在组件中属性是- 表示,它 自动会转化成驼峰式。传进来的数据是mes-father, 转化成mesFather, 我们在js 里面写mesFather, 一一对应,子组件可以接受到组件。props 属性是和data,methods 属性并列的,属同一级别。props 属性里面定义的变量,在 子组件中的template 中可以直接使用。
Appvue文件:
Hellovue文件:
这时,在页面中看到 message from father 字样,父元素向子元素传递数据成功。
子------父
子组件向父组件传递数据,需要用到自定义事件。 例如,我们在Hellovue,写入一个input, 接收用户输入,我们想把用户输入的数据传给父组件。这时,input 需要先绑定一个keypress 事件,获取用户的输入,同时还要发射自定义事件,如valueUp, 父组件只要监听这个自定义事件,就可以知道子组件要向他传递数据了。子组件在发射自定义事件时,还可以携带参数,父组件在监听该事件时,还可以接受参数,参数,就是要传递的数据。
在Hellovue template中,添加一个input输入框,给它一个v-model 获取用户的输入,再添加keypress的事件,用于发射事件,传输数据。script 中添加data,定义变量来获取用户的输入,添加methods 来处理keypress事件的处理函数enter
Hellovue文件:
在Appvue 中,template中hello 组件绑定一个自定义事件,@valueUp =“receive”, 用于监听子组件发射的事件,再写一个p 元素,用于展示子组件传递过来的数据,<p>子组件传递过来的数据{{childMes }}</p>
相应地,在scrpit中,data 中,定义一个变量childMes, 并在methods 中,定义一个事件处理函数reciever。
Appvue文件:
这时在input中输入内容,然后按enter键,就以看到子组件传递过来的数据,子组件向父组件传递数据成功。
当在input输入框中输入数据,并按enter键时,它会触发keypressenter事件,从而调用事件处理函数enter, 在enter 中, 我们发射了一个事件valueUp, 并携带了一个参数,由于在<hello @valueUp=”recieve”></hello> 组件中, 我们绑定valueUp 事件,所以父组件在时刻监听valueUp 事件, 当子组件发射value 事件时,父组件立刻捕获到,并立即调用它的回调函数receive, 在receive 中,我们获取到子组件传递过来的数据,并赋值了data 中的变量childMes, 由于data 数据发生变化,从而触发dom更新,页面中就显示子组件传递过来的内容。
谢谢!结束!
<view>父组件msg的值:{{msg}}</view>
<Header msg="{{msg}}" bindchildChange="change" ></Header>
<block wx:for="{{list}}" wx:key="index">
<ListItem rItem="{{item}}" bindchildGO="childGO"></ListItem>
</block>
<Header msg="{{msg}}"></Header>
/ pages/list/listwxss /
item{
padding: 5px;
}
img1{
width: 120px;
height: 120px;
border-radius: 5px;
}
row{
flex: 1;
height: 120px;
}
title{
padding: 10px;
}
dec{
padding:0 10px;
}
// pages/list/listjs
Page({
/
页面的初始数据
/
data: {
msg:"你是我的小宝贝",
list:[{
url:">
这个官网很清楚,也很简单,父组件中使用v-bind绑定传送,子组件使用props接收即可
例如:
父组件中:
子组件中:
这种情况下,子组件的methods中想要取到props中的值,直接使用thischartData即可
但是有写情况下,你的chartData里面的值并不是固定的,而是动态获取的,这种情况下,你会发现methods中是取不到你的chartData的,或者取到的一直是默认值
比如下面这个情况:
父组件中:
此时子组件的methods中使用thischartData会发现是不存在的(因为为空了)
这情况我是使用watch处理
监听chartData的值,当它由空转变时就会触发,这时候就能取到了,拿到值后要做的处理方法也需要在watch里面执行
以上就是关于vue父子组件之间的通信全部的内容,包括:vue父子组件之间的通信、微信小程序组件及获取用户权限、vue中子组件的methods中获取到props中的值方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)