上一节,我们定义了组件的基本使用,下面我们看看组件其他的一些特性。

1.组件作用域

同时在Vue对象和组件中定义一个属性,显示结果是怎样的呢?

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
{{ msg }}
<my-component></my-component>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
msg: 'hello world'
},
components: {
'my-component':{
template: '<div>{{ msg }}</div>',
data: function () {
return {
msg: 'hello shijingjing'
}
}
}
}
})
</script>
</html>

运行结果:

可见,都在各自的作用域内有效,且组件不影响Vue定义的属性。

如何让组件使用Vue定义的属性呢,上节已经提到过,使用props属性。如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<my-component v-bind:my-msg="msg"></my-component>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
msg: 'hello world'
},
components: {
'my-component':{
template: '<div>{{ myMsg }}</div>',
props: ['myMsg']
}
}
})
</script>
</html>

运行结果:

2.slot占位符

slot的意思是卡槽,也就是一个占位符,内容由组件包含的内容而定。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<my-component>
<div>这是组件里面真正包含的内容</div>
</my-component>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
components: {
'my-component':{
template: '<div>hello world</div><slot>这只是一个占位符,具体内容由component包含的内容来定</slot>'
}
}
})
</script>
</html>

运行结果:

如果组件里面没有包含内容呢?

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<my-component>
</my-component>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
components: {
'my-component':{
template: '<div>hello world</div><slot>这只是一个占位符,具体内容由component包含的内容来定</slot>'
}
}
})
</script>
</html>

运行结果:

可以再组件中包含占位符,来定义更为通用的组件。如一个对话框组件,不同时候弹出的标题不同,那么标题可以使用slot定义,真正内容放到组件内部。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<my-component>
<header slot="header">
你好吗
</header>
<div slot="body">
是的
</div>
<footer slot="footer">
再见
</footer>
</my-component>
------------------------------------------------------
<my-component>
<header slot="header">
早上好
</header>
<div slot="body">
中午好
</div>
<footer slot="footer">
晚上好
</footer>
</my-component>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
components: {
'my-component':{
template: '<div>hello world</div><slot name="header"></slot><slot name="body"></slot><slot name="footer"></slot>'
}
}
})
</script>
</html>

运行结果:

3.组件之间数据访问

1)父组件访问子组件属性 $children

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<my-component></my-component>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
components: {
'my-component':{
template: '<div>hello world</div><child-component1></child-component1><button v-on:click="showChildData">显示组件</button>',
components:{
'child-component1':{
template: '<div>hello child 1</div>',
data: function () {
return {
msg: 'child 1'
}
}
}
},
methods:{
showChildData: function () {
console.log(this.$children[0].msg);
}
}
}
}
})
</script>
</html>

运行结果:

除了$children,还可以使用v-ref:c1来给组件指定一个索引名称c1,查询子组件时,使用$refs.c1找到这个子组件。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<my-component></my-component>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
components: {
'my-component':{
template: '<div>hello world</div><child-component1 v-ref:c1></child-component1><button v-on:click="showChildData">显示子组件</button>',
components:{
'child-component1':{
template: '<div>hello child 1</div>',
data: function () {
return {
msg: 'child 1'
}
}
}
},
methods:{
showChildData: function () {
console.log(this.$refs.c1.msg);
}
}
}
}
})
</script>
</html>

运行结果:

2)子组件访问父组件属性 $parent

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<my-component></my-component>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
components: {
'my-component':{
template: '<div>hello world</div><child-component1></child-component1>',
components:{
'child-component1':{
template: '<div>hello child 1</div><button v-on:click="showParentData">显示父组件</button>', methods:{
showParentData: function () {
console.log(this.$parent.msg);
}
}
}
},
data: function () {
return {
msg: 'parent'
}
}
}
}
})
</script>
</html>

运行结果:

3)子组件访问根组件属性 $root

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<my-component></my-component>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
msg: 'root'
},
components: {
'my-component':{
template: '<div>hello world</div><child-component1></child-component1>',
components:{
'child-component1':{
template: '<div>hello child 1</div><button v-on:click="showRootData">显示根组件</button>', methods:{
showRootData: function () {
console.log(this.$root.msg);
}
}
}
}
}
}
})
</script>
</html>

运行结果:

可见,根元素指的是Vue对象

由$children,$parent,$root可以实现父子组件,以及Vue对象间的数据交互,但是还是尽量使用props属性来传递数据,

可以避免父子组件的过度耦合,以及子组件修改了父组件中的数据。

4.组件之间事件传递

1)派发事件$dispatch,事件沿着父链冒泡

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
{{ message }}
<my-component></my-component>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
message: ''
},
components: {
'my-component':{
template: ' <input v-model="msg" /><button v-on:click="notify">dispatch</button>',
data: function () {
return {
msg: ''
}
},
methods:{
notify: function () {
this.$dispatch('child-msg', this.msg);
}
}
}
},
events:{
'child-msg': function (msg) {
this.message = msg;
}
}
})
</script>
</html>

运行结果:

$.dispatch会将事件派发到父组件的events事件,父组件接收到子组件的派发后,调用child-msg事件。

2)broadcast广播事件,事件向下传导给所有的子组件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<input type="text" v-model="message"/>
<button v-on:click="notify">broadcast</button>
<my-component></my-component>
</div>
</body>
<script src="js/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
message: ''
},
components: {
'my-component':{
template: '{{msg}}',
data: function () {
return {
msg: ''
}
},
events:{
'parent-msg': function (msg) {
this.msg = msg;
}
}
}
},
methods:{
notify: function () {
this.$broadcast('parent-msg', this.message);
}
}
})
</script>
</html>

运行结果:

$.broadcast会将事件广播到子组件的events事件,子组件接收到父组件的广播后,调用parent-msg事件。

Vue.js使用-组件(下篇)的更多相关文章

  1. Vue.js多重组件嵌套

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

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

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

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

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

  4. Vue.js之组件传值

    Vue.js之组件传值 属性传值可以从父组件到子组件,也可以从子组件到父组件. 这里讲一下从父组件到子组件的传值 还以上次的demo为例,demo里有APP.vue是父组件,Header.vue,Us ...

  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说说组件

    什么是组件:组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HTM ...

  9. Vue.js 递归组件实现树形菜单

    最近看了 Vue.js 的递归组件,实现了一个最基本的树形菜单. 项目结构: main.js 作为入口,很简单: import Vue from 'vue' Vue.config.debug = tr ...

随机推荐

  1. 解决CSS的position:absolute中left效果

    有时候css中设置了position:absolute,left:100px,但是如果我们不想要这个left怎么办呢,当然你直接删除就可以,但是如果是框架的css,你直接删除就有问题了,这时候该怎么办 ...

  2. ios中xml和html解析(封装)

    下载地址  http://pan.baidu.com/share/link?shareid=2902188921&uk=923776187 GDataXML和TFHpple配置是一样的(配置方 ...

  3. java节假日api--关于节假日想到的

    http://goseek.cn/index.php. 跟一园友讨论节假日问题得之一网址...涨姿势...(仅限中国节假日) http://api.goseek.cn/ 另一网友整理了测试类: htt ...

  4. xshell连接centos vi编辑器不能使用小键盘

    莫名其妙的本人的xshell,在vim编辑脚本的时候,右侧小键盘无法输出数字,输出的都是一些字母,而且还是一个字母占一行,太过艹蛋! 后来就按照正规的操作步骤,又重建了连接,居然发现正常了! 百思一虑 ...

  5. memcached全面剖析--2.理解memcached的内存存储

    下面是<memcached全面剖析>的第二部分. 发表日:2008/7/9 作者:前坂徹(Toru Maesaka) 原文链接:http://gihyo.jp/dev/feature/01 ...

  6. Mac 下查看网络端口占用情况

    1.Mac 下查看网络端口占用情况 有的时候关闭了服务器,但是端口还是占用,解决的方法是 kill 掉占用该端口的进程. # 查看 8009 端口的占用情况 $ lsof -i:8009 可以看到,该 ...

  7. 【struts2】自定义更强大的logger拦截器

    Struts2自带的logger拦截器只是打印出了Action所对应的URL以及执行的方法名称,这对实际开发来说是肯定不够的.实际开发中为了调试方便,要记录的信息比较多,通常需要把这次请求相关的几乎所 ...

  8. jquery ajax context

    function yflib_roomList(tpl) { var target = $(".roomList > li"); var _this = null; $(&q ...

  9. win8 应用商店程序使用SQLITE数据库

    http://www.cnblogs.com/zhuzhenyu/archive/2012/11/27/2790193.html using SQLite; using System; using S ...

  10. spring-cloud/spring-cloud-sleuth github 项目 mark

    97  Star639 Fork335 spring-cloud/spring-cloud-sleuth CodeIssues 5Pull requests 1Projects 0WikiInsigh ...