视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Vue中父子组件间的通信
2020-11-27 19:33:45 责编:小采
文档
 这篇文章主要介绍了关于Vue中父子组件间的通信,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

Vue.js是一套构建用户界面的渐进式框架。与其他重量级框架不同的是,Vue 从根本上采用最小成本、渐进增量的设计。Vue 的核心库只专注于视图层,并且很容易与其他第三方库或现有项目集成。另一方面,当与单文件组件和 Vue 生态系统支持的库结合使用时,Vue 也完全能够为复杂的单页应用程序提供有力驱动。

一、运行环境搭建

Vue引入方式一般有三种:

第一种CDN引入

<script src="[https://cdn.jsdelivr.net/npm/vue](https://cdn.jsdelivr.net/npm/vue)"></script>

第二种使用 NPM 安装

$ npm install vue//安装最新稳定版

第三种搭建脚手架CLI
所谓脚手架是通过webpack搭建的开发环境,用于快速搭建大型单页面应用程序。能够为现代前端开发的工作流程,带来持久强力的基础架构。只需几分钟,就可以建立并运行一个带有“热重载、保存时代码检查以及可直接用于生产环境的构建配置”的项目。
首先必须先安装node.js,Node.js 在 0.6.3 版本开始内建npm,所以安装好node.js后,npm也就装好。然后在通过git bash 操作以下命令行:

$ node -v//检查是否已经装好了node
$ npm -v//检查是否已经装好了npm
$ npm install --global vue-cli //安装 vue-cli
$ vue init webpack project//进入目标文件夹创建一个新项目
$ cd project//进入新项目
$ npm install//安装package.json中依赖的node_modules
$ npm run dev//运行该项目

对于用户,建议将npm的注册表源设置为国内的镜像,可以大幅提升安装速度。推荐使用这种安装脚手架。

npm config set registry https://registry.npm.taobao.org//配置淘宝镜像
npm config get registry//验证是否成功
npm install -g cnpm --registry=https://registry.npm.taobao.org//安装cnpm
cnpm install -g vue-cli//cnpm安装脚手架
vue init webpack my-project
cd my-project
cnpm install
cnpm run dev

最后打开http://localhost:8080,就出现下面的页面,标志着脚手架搭建完成了。

二、介绍SRC文件流程及根组件App

脚手架搭建完成后,project里面各个文件夹及文件,如下图:

1.src文件流程介绍

index.html(入口文件)=>main.js=>App.vue(根组件),根组件中模板内容就直接插入到入口文件中#app处,然后再将页面呈现出来。

2.根组件App介绍

主要由三部分组成,分别为模板(html结构),行为(处理逻辑)和样式(解决样式)

三、vue组件嵌套

vue组件嵌套是指写好的子组件如何与根组件取得关联,通常可以分为组件全局定义和组件局部定义,后者比较常见。

1.组件全局定义

一般以下两个步骤:

①main.js引入子组件

②App.vue组件中template调用

//main.js
import Vue from 'vue'
import App from './App'
import Users from "./components/Users";//引入子组件Users
Vue.config.productionTip = false
Vue.component("users",Users);//自定义名字便于App.vue组件调用,后者为组件名
new Vue({
 el: '#app',
 components: { App },
 template: '<App/>'
})
//App.vue组件
<template>
 <p id="app">
 <users></users>//在这里调用,自定义名字是小写的
 </p>
</template>

2.组件局部定义

一般以下三个步骤:

①import引入子组件

②export default注册子组件

③template模板中加入子组件

四、父组件向子组件传值

接下来我们通过一个例子,说明父组件如何向子组件传递值:在子组件Users.vue中如何获取父组件App.vue中的数据 users:["Henry","Bucky","Emily"]

1.创建子组件,在src/components/文件夹下新建一个Users.vue子组件

2.在App.vue中注册Users.vue组件,并在template中加入users标签

//App.vue父组件
<template>
 <p id="app">
 <users v-bind:users="users"></users>//前者自定义名称便于子组件调用,后者要传递数据名
 </p>
</template>
<script>
import Users from "./components/Users"
export default {
 name: 'App',
 data(){
 return{
 users:["Henry","Bucky","Emily"]
 }
 },
 components:{
 "users":Users
 }
}

3.Users.vue的中创建props,然后创建一个users的属性

//users子组件
<template>
 <p class="hello">
 <ul>
 <li v-for="user in users">{{user}}</li>//遍历传递过来的值,然后呈现到页面
 </ul>
 </p>
</template>
<script>
export default {
 name: 'HelloWorld',
 props:{
 users:{ //这个就是父组件中子标签自定义名字
 type:Array,
 required:true
 }
 }
}
</script>

五、子组件向父组件传值(通过事件形式)

接下来我们通过一个例子,说明子组件如何向父组件传递值:
当我们点击“Vue.js Demo”后,子组件向父组件传递值,文字由原来的“传递的是一个值”变成“子向父组件传值”,实现子组件向父组件值的传递。

1.在子组件(header组件)中文字部分绑定一个点击事件

<template>
 <header>
 <h1 @click="changeTitle">{{title}}</h1>//绑定一个点击事件
 </header>
</template>
<script>

2.子组件中响应该点击事件的函数中使用$emit来触发一个自定义事件,并传递一个参数

<script>
export default {
 name: 'app-header',
 data() {
 return {
 title:"Vue.js Demo"
 }
 },
 methods:{
 changeTitle() {
 this.$emit("titleChanged","子向父组件传值");//自定义事件 传递值“子向父组件传值”
 }
 }
}
</script>

3.在父组件(App根组件)中的子标签中监听该自定义事件并添加一个响应该事件的处理方法

<template>
 <p id="app">
 <app-header v-on:titleChanged="updateTitle($event)" ></app-header>//与子组件titleChanged自定义事件保持一致,updateTitle($event)接受传递过来的文字
 <h2>{{title}}</h2>
 </p>
</template>
<script>
import Header from "./components/Header"
export default {
 name: 'App',
 data(){
 return{
 title:"传递的是一个值"
 }
 },
 methods:{
 updateTitle(e){ //声明这个函数
 this.title = e;
 }
 },
 components:{
 "app-header":Header,
 }
}
</script>

六、总结

在通信中,无论是子组件向父组件传值还是父组件向子组件传值,他们都有一个共同点就是都有中间介质,子向父的介质是自定义事件,父向子的介质是props中的属性。

下载本文
显示全文
专题