先创建项目并运行

vue init webpack-simple template
cd template
npm i
npm run dev

一、子组件访问父组件的数据

方式一 :子组件直接访问父组件的数据

  1. 父组件在调用子组件时,绑定想要获取的父组件中的数据
  2. 在子组件内部,使用 props 选项声明获取的数据,即接收来自父组件中的数据

创建如下目录

 
 

App.vue 中写入

<template>
<div class="hello">
<h3>我是 App 父组件</h3>
<h4>访问自己的数据:{{msg}},{{name}},{{user.id}}</h4>
<hr>
<!-- 1. 在调用子组件时,绑定想要获取的父组件中的数据 -->
<Hello :message="msg" :name="name" :user="user"></Hello>
</div>
</template> <script>
// 引入 Hello 组件
import Hello from './assets/components/Hello.vue'
export default {
data(){
return {
msg:'父组件',
name:'tom',
age:'22',
user:{
id:1234,
userName:'Jack'
}
}
},
// 注册 Hello 组件
components:{
Hello
}
}
</script>

Hello.vue 文件中写入

<template>
<div class="hello">
<h3>我是 hello 子组件</h3>
<!-- 在页面中直接渲染即可 -->
<h4>访问父组件中的数据: {{message}},{{name}},{{user.id}}</h4>
</div>
</template> <script>
export default {
// 2. 在子组件内部,使用 props 选项声明获取的数据,即接收来自父组件中的数据
props:['message','name','user']
}
</script>

最后效果:

 
成功访问到父组件的数据

方式二 :为组件的 prop 指定 验证 规则,如果传入的数据不符合要求,Vue 会发出警告

  1. 父组件在调用子组件时,绑定想要获取的父组件中的数据
  2. 在 props 内以对象的形式写入校验规则

App.vue 中写入

<template>
<div class="hello">
<h3>我是 App 父组件</h3>
<h4>访问自己的数据:{{msg}},{{name}},{{user.id}}</h4>
<hr>
<!-- 1. 在调用子组件时,绑定想要获取的父组件中的数据 -->
<Hello :message="msg" :name="name" :age="age" :user="user" :money="money"></Hello>
</div>
</template> <script>
// 引入 Hello 组件
import Hello from './assets/components/Hello.vue'
export default {
data(){
return {
msg:'父组件',
name:'tom',
age:'22',
user:{
id:9876,
userName:'Jack'
},
money:'123'
}
},
// 注册 Hello 组件
components:{
Hello
}
}
</script>

Hello.vue 中写入

<template>
<div class="hello">
<h3>我是 hello 子组件</h3>
<!-- 在页面中直接渲染即可 -->
<h4>访问父组件中的数据:
{{message}} <br>
{{name}}<br>
{{user.id}}<br>
{{user.userName}}<br>
{{age}}<br>
{{ageOne}}<br>
{{money}}<br>
</h4>
</div>
</template> <script>
export default {
props:{
// 基础类型检测 (`null` 指允许任何类型)
message:String,
// 可能是多种类型
name:[String,Number],
// 必传且是字符串
age:{
type:String,
required:true
},
// 数值且有默认值 如果父组件中没有该数据绑定,显示以下的默认值
ageOne:{
type: Number,
default: 10
},
// 数组/对象的默认值应当由一个工厂函数返回
user:{
type:Object,
default:function(){
return {
userName: 'Doctor'
}
}
},
// 自定义验证函数
money:{
validator:function(value){
return value > 100
}
}
}
}
</script>

效果如下

 
 

注意:Prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是反过来不会。这是为了防止子组件无意间修改了父组件的状态,来避免应用的数据流变得难以理解。
另外,每次父组件更新时,子组件的所有 prop 都会更新为最新值。这意味着你不应该在子组件内部改变 prop。

二、父组件访问子组件的数据
  1. 在子组件中使用 $emit(事件名,数据) 触发一个自定义事件发送数据
  2. 在父组件在使用子组件的标签内监听子组件的触发事件,并在父组件中定义方法用来获取数据

在 Hello.vue 中写入

<template>
<div class="hello">
<h3>我是 hello 子组件</h3>
<h4>访问自己的数据:
{{msg}} <br>
{{name}}
</h4>
<!-- 触发 send 事件 ,发送数据 -->
<button @click="send">将子组件中的数据发送给父组件</button>
</div>
</template> <script>
export default {
data(){
return {
msg:'子组件',
name:'tom'
}
},
methods:{
// 在此处定义事件,用来发送数据,也可直接写到 mounted 内自动发送
send(){
// 此处的 this 表示当前子组件的实例
this.$emit('hello',this.msg,this.name)
}
}
}
</script>

在 App.vue 中写入

<template>
<div class="hello">
<h3>我是 App 父组件</h3>
<!-- 6. 在页面中渲染 -->
<h4>访问子组件的数据:{{msg}},{{name}}</h4>
<hr>
<!-- 子组件 -->
<!-- 3. 在子组件标签内监听子组件事件的触发 -->
<Hello @hello="getData"></Hello>
</div>
</template> <script>
// 引入 Hello 组件
import Hello from './assets/components/Hello.vue'
export default {
data(){
return {
// 4. 初始化数据对象
msg:'',
name:'',
}
},
methods:{
// 5. 接收子组件传过来的数据
getData(msg,name){
this.msg = msg,
this.name = name
}
},
// 注册 Hello 组件
components:{
Hello
}
}
</script>

效果图:

 

NO--16 vue之父子组件传值的更多相关文章

  1. vue 非父子组件传值

    /*非父子组件传值 1.新建一个js文件 然后引入vue 实例化vue 最后暴露这个实例 2.在要广播的地方引入刚才定义的实例 3.通过 VueEmit.$emit('名称','数据') 4.在接收收 ...

  2. Vue中非父子组件传值的问题

    父子组件传值的问题,前面已经讲过,不再叙述,这里来说一种非父子组件的传值. vue官网指出,可以使用一个空vue实例作为事件中央线! 也就是说 非父子组件之间的通信,必须要有公共的实例(可以是空的), ...

  3. Vue非父子组件传值

    <template> <div id="app"> <v-home></v-home> <br> <hr> ...

  4. vue 中父子组件传值:props和$emit

    更新----------- 1 父组件向子组件传值:通过props数组: 在vue-cli Login.vue父组件中有AcceptAndRefuse.vue子组件,首先import进子组件hello ...

  5. vue中父子组件传值问题 通过props 和 $emit()方法

    (代码在最后) 1.父组件给子组件传值直接通过props,听着很简单,但是对于初学者来说还是比较难以理解的,今天小白通过自己的实践操作结合代码分析一下 案例  把模态框单独的抽离出来,当作一个组件 第 ...

  6. vue ref父子组件传值

    一. ref使用在父组件上 父组件html: <information ref='information'></information> import information ...

  7. Vue组件传值(二)之 非父子组件传值

    Vue中非父子组件之间是如何实现通信的? 本章主要讲的是非父子组件传值,父子组件传值请看上一篇文章. 1.创建新的Vue实例引入项目中,通过$emit.$on来实现非父子组件传值: 1 <!DO ...

  8. 【vue】父组件主动调用子组件 /// 非父子组件传值

    一  父组件主动调用子组件: 注意:在父组件使用子组件的标签上注入ref属性,例如: <div id="home"> <v-header ref="he ...

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

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

随机推荐

  1. [咸恩静][Good Bye]

    歌词来源:http://music.163.com/#/song?id=35437298 作曲 : 安英民 [作曲 : 安英民] 作词 : 安英民/로코 [作词 : 安英民/lo-Ko] 나를 떠나버 ...

  2. Ubuntu18.04 使用过程遇到的问题记录

    索引: 1.Ubuntu 18.04 安装搜狗输入法 2.在 Ubuntu 18.04 中将第三方软件添加至 favorite 菜单栏 3.在 VMware workstation 中为虚拟机安装 V ...

  3. AbstractApplicationContext 笔记

    一.这个类的属性 public abstract class AbstractApplicationContext extends DefaultResourceLoader implements C ...

  4. Python基础.md

    数据结构 列表 访问 list1 = ['java','C','C++','Python'] In [10]: list1[1] Out[10]: 'C' In [11]: list1[-1] Out ...

  5. Android 4.4中AudioRecord用例 - 录制系统内置声音

    通过API 19新加的MediaRecorder.AudioSource.REMOTE_SUBMIX參数能够让系统App录制系统内置的声音,也就是扬声器的声音.以下是一个巨简单的样例来演示样例怎样通过 ...

  6. cocos2d-x发生undefined reference to `XX'异常 一劳永逸解决的方法

    转自:http://www.myexception.cn/operating-system/1620542.html cocos2d-x发生undefined reference to `XX'错误 ...

  7. 【洛谷】【线段树】P1886 滑动窗口

    [题目描述:] 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. [输入格式:] 输入一共 ...

  8. maven3 下载列表

    https://archive.apache.org/dist/maven/maven-3/ Parent Directory - 3.0.4/ 2012-09-11 09:37 - 3.0.5/ 2 ...

  9. JVM(三)调优工具

    前言 给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异常堆栈.GC日志.线程快照(threaddump/javacore文件). ...

  10. 404 Note Found队Beta4

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员:恺琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组 ...