Vue.js之组件传值

属性传值可以从父组件到子组件,也可以从子组件到父组件。

这里讲一下从父组件到子组件的传值

  还以上次的demo为例,demo里有APP.vue是父组件,Header.vue,Users.vue和Footer.vue为子组件,Users.vue中的数据有个数组,现在把数组放到父组件App.vue中

App.vue文件:

 <template>
<div id="app">
<app-header></app-header>
<users v-bind:users="users"></users>
<app-footer></app-footer>
</div>
</template>
<!--行为-->
<script>
//局部注册组件
import Users from './components/Users'
import Header from './components/Header'
import Footer from './components/Footer' export default {
name: 'App',
data(){
return {
users:[
{name:"Henry",Position:"Java工程师",show:false},
{name:"Lily",Position:"Java工程师",show:false},
{name:"Kang",Position:"Java工程师",show:false},
{name:"Henry",Position:"Java工程师",show:false},
{name:"Henry",Position:"Java工程师",show:false}
]
}
},
components:{
"users":Users,
"app-header":Header,
"app-footer":Footer
}
}
</script> <!--样式-->
<style > h1{
color: pink;
}
</style>

  这里通过与子组件关联的 <users></users> 标签传值,在标签里通过 V-bind:users=“users” 来实现,前面的users是我们起的别名,后面的“users”为data()返回值里面的users数组.

然后在子组件里接收数据,接收数据这里有两种方法。

第一种:

  在子组件Users.vue中的script里,直接通过 props:[“users”] 来获取数组,这样就可以在子组件里直接使用users数组,但是这种方法不够严谨。

 <script>
export default {
name: 'users',
props:['users']
}
</script>

第二种:
  在子组件Users.vue中的script里,通过通过 props:{...} 来获取

 <script>
export default {
name: 'users',
props:{
users:{
type:Array,
required:true
}
}
}
</script>

  在props中,可以接收多个对象,而且可以指定对象的类型,而且可以说明是不是规格的数据。

属性传值的时候可以传两种东西,一个是传具体的值,另一个是传引用,这里的引用一般只有两个东西,一个是数组,一个是对象

注意:注意传值和传引用的区别

  传值: string   number   boolean
  传引用: array  object

  传值和传引用会带来不同的效果,选择哪一种要根据项目的具体需求而定。
  例如上面的例子,传的就是一个数组,是传引用,既然是传引用,就会出现一些问题,例如在项目中多次引用数据,如果添加或者删除一个地方的数据,其他地方的数据也会出现变化,
但是传值的话,修改一个地方其他地方并不会改变

子组件像父组件传值
1.通过事件传值

  首先在子组件中注册一个事件,通过 this.$emit("titleChanged","子向父组件传值"); 第一个参数是当前注册事件的名字是什么,自己定义的一个事件,第二个参数是该事件要传的内容。
例如:
  Header.vue文件:

 <template>
<header @click="changeTitle">
<h1>{{title}}</h1>
</header>
</template> <script>
export default {
name: 'app-header',
data () {
return {
title1:"Vue.js Demo"
}
},
props:{
title:{
type:String
}
},
methods:{
changeTitle:function(){
this.$emit("titleChanged","子向父组件传值");
}
}
}
</script> <style scoped>
header{
background: pink;
padding: 10px;
}
h1{
color: #222;
text-align: center;
}
</style>

  当在header上点击,就出触发changeTitle方法,然后这个changeTitle方法会在父组件App.vue中寻找titleChanged事件,然后在父组件中实现titleChanged事件。

  App.vue文件:

 <!--模板-->
<template>
<div id="app">
<app-header @titleChanged="updateTitle($event)" :title="title"></app-header>
<users :users="users"></users>
<app-footer></app-footer>
</div>
</template> <!--行为-->
<script>
//局部注册组件
import Users from './components/Users'
import Header from './components/Header'
import Footer from './components/Footer' export default {
name: 'App',
data(){
return {
title:"这是一个title!"
}
},
methods:{
updateTitle:function (title) {
this.title = title;
}
},
components:{
"users":Users,
"app-header":Header,
"app-footer":Footer
} }
</script> <!--样式-->
<style > h1{
color: pink;
}
</style>

  在App.vue组件中与子组件关联的标签中绑定一个事件 @titleChanged="updateTitle($event)" ,事件名字就是子组件注册的事件名字,然后这个事件再实现一个方法 updateTitle($event) ,接收参数用 $event ,接下来在App.vue组件中实现 updateTitle() 方法,这里的 this.title=title 中的this.title是当前页面的title,后面的title是形参,是子组件传递过来的参数。

  这样运行程序后,在header上点击以后就替换成了从子组件中传过来的值,OK现在来分析一下工作流程:

  当我们点击header标签的时候,会触发Header.vue组件中的changeTitle方法,触发这个方法以后,方法里注册了一个事件titleChanged,并且该事件传递了一个参数,然后会在父组件App.vue中寻找titleChanged事件,然后App.vue中的这个事件实现了updateTitle方法,然后该方法用子组件传递过来的值替换了当前组件的title的值。

  这样就简单的实现了通过事件的方法从子组件向父组件传值。

Vue.js之组件传值的更多相关文章

  1. vue.js 兄弟组件传值

    另:  在vue里,组件之间的作用域是独立的,父组件跟子组件之间的通讯可以通过prop属性来传参,但是在兄弟组件之间通讯就比较麻烦了,虽然可以使用事件监听的方式,但还是不如vuex专业.比如A组件要告 ...

  2. Vue.js多重组件嵌套

    Vue.js多重组件嵌套 Vue.js中提供了非常棒的组件化思想,组件提高了代码的复用性.今天我们来实现一个形如 <app> <app-header></app-head ...

  3. 【Vue课堂】Vue.js 父子组件之间通信的十种方式

    这篇文章介绍了Vue.js 父子组件之间通信的十种方式,不管是初学者还是已经在用 Vue 的开发者都会有所收获.无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽 ...

  4. 【Vue.js实战案例】- Vue.js递归组件实现组织架构树和选人功能

    大家好!先上图看看本次案例的整体效果. 浪奔,浪流,万里涛涛江水永不休.如果在jq时代来实这个功能简直有些噩梦了,但是自从前端思想发展到现在的以MVVM为主流的大背景下,来实现一个这样繁杂的功能简直不 ...

  5. Vue.js之组件嵌套小demo

    Vue.js之组件嵌套的小demo项目 第一步:初始化一个wabpack项目,这里不在复述.第二步:在components文件夹下新建Header.vue Footer.vue和Users.vue三个 ...

  6. Vue.js之组件嵌套

    Vue.js中组件嵌套有两种方式 第一种:注册全局组件 例如在components文件夹下新建一个User.vue组件,然后在main.js文件中注册全局组件 //注册全局组件 Vue.compone ...

  7. vue.js 同级组件之间的值传递方法(uni-app通用)

    vue.js 兄弟组件之间的值传递方法 https://blog.csdn.net/jingtian678/article/details/81634149

  8. VUe.js 父组件向子组件中传值及方法

    父组件向子组件中传值 1.  Vue实例可以看做是大的组件,那么在其内部定义的私有组件与这个实例之间就出现了父子组件的对应关系. 2. 父子组件在默认的情况下,子组件是无妨访问到父组件中的数据的,所以 ...

  9. Vue.js父子组件如何传值 通俗易懂

    父子组件传值原理图 一般页面的视图App.vue应为这样 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.vue 2.Child.vue的中创建pr ...

随机推荐

  1. Spring AOP事务管理(使用切面把事务管理起来)

    在<Spring Transaction 分析事务属性(事务的基本概念.配置)>基础上 http://blog.csdn.net/partner4java/article/details/ ...

  2. Linux 性能监控 —— Load Average

    一. 简单介绍 top. uptime. cat /proc/loadavg 命令中 Load average: 4.90, 5.51, 5.77        整体含义: 正在执行的任务数量 + 排 ...

  3. docker run

    1.登录Docker Hub 账户 2.输入命令:构建一个web应用. docker run -d -P training/webapp python app.py 参数说明: -d:让容器在后台运行 ...

  4. vue 组件1

    注意:vue组件中的data必须为一个函数,要不vue就会停止工作. 构成组件 组件意味着协同工作,通常父子组件会是这样的关系:组件A在它的模板中使用了组件B,他们之间必然需要相互通信:父组件需要给子 ...

  5. centos6.5下redis的安装与配置

    参照官网描述(https://redis.io/download),linux下redis安装步骤如下: $ wget http://download.redis.io/releases/redis- ...

  6. 把world转成html

    本来用php转的 效果不太理想 很不稳定 最后试了下java 效果不错 只记录java的方法好了 其实他们的原理都是一样的啊,都是用到了微软的com 首先是准备工作 下载(明确dll的版本是64位的还 ...

  7. jetty访问jsp页面出现异常:org.apache.jasper.JasperException: PWC6345: A full JDK (not just JRE) is required解决

    今天在jetty下配置一个jsp模版的报表页面,报如下异常信息:   org.apache.jasper.JasperException: PWC6345: There is an error in ...

  8. JAVA的protected权限

    1.派生类能够訪问父类的protected数据.这是毫无疑问的. 2.今天做Think in java的习题发现,同一个包内的一个类调用还有一个类的protected数据是能够的.代码例如以下: pa ...

  9. cvsba-1.0.0/utils/test_cvsba.cpp:.......error: ‘numeric_limits’ is not a member of ‘std’... error: expected primary-expression before ‘float’....

    cvsba库http://www.uco.es/investiga/grupos/ava/node/39,不知道怎么回事,记得以前编译没有错误,不知道作者是否更新了还是怎么着,新的现在有以下错误: 解 ...

  10. javascript iframe 操作(一)

    [兼容所有浏览器 包括IE7/8/9] 1.父页面中获取IFRAME的WINDOW对象 获得了window对象后,就可以调用iframe页面中定义的方法等. IE:可以通过iframeId.windo ...