(1)访问元素&组件

①访问根实例

在每个 new Vue 实例的子组件中,其根实例可以通过 $root 属性进行访问。例如,在这个根实例中:

// Vue 根实例
new Vue({
data: {
foo:
},
computed: {
bar: function () { /* ... */ }
},
methods: {
baz: function () { /* ... */ }
}
})

所有的子组件都可以将这个实例作为一个全局 store 来访问或使用。

/* 获取根组件的数据 */
this.$root.foo
/* 写入根组件的数据 */
this.$root.foo =
/* 访问根组件的计算属性 */
this.$root.bar
/* 调用根组件的方法 */
this.$root.baz()

案例demo:

    <!-- 访问根实例 -->
<div class="root_area">
<p>{{message}}</p>
<p>数据倒置:{{reverseMessage}}</p>
<button v-on:click="change" :title="title">方法1</button>
<button v-on:click="transfer">调用方法1</button>
</div>
<script type="text/javascript">
new Vue({
el:".root_area",
data:{
message:"展示信息",
title:"鼠标悬停展示信息"
},
methods:{
change:function(){
/* 1、写入根组件数据 */
this.$root.message = "写入根组件新数据";
this.$root.title = "写入根组件新数据-鼠标悬停展示信息"
/* 2、获取根组件数据 */
console.log(this.$root.message);
console.log(this.$root.title);
},
transfer:function(){
/* 3、调用根组件方法 */
this.$root.change()
/* 4、访问根组件的计算属性 */
console.log(this.$root.reverseMessage)
}
},
computed:{
reverseMessage:function(){
return this.message.split('').reverse().join('');
}
}
})
</script>

计算属性VS方法:

可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。这也同样意味着下面的计算属性将不再更新,因为 Date.now() 不是响应式依赖:

computed: {
now: function () {
return Date.now()
}
}

相比之下,每当触发重新渲染时,调用方法将总会再次执行函数。我们为什么需要缓存?假设我们有一个性能开销比较大的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A 。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用方法来替代。

Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调。

②访问父级组件实例

和 $root 类似,$parent 属性可以用来从一个子组件访问父组件的实例。它提供了一种机会,可以在后期随时触达父级组件,以替代将数据以 prop 的方式传入子组件的方式。

    <!-- 访问父级组件实例 -->
<div class="parent_area">
<parent-com></parent-com>
</div>
/* 父级组件实例 */
Vue.component('parent-com',{
template:`<div>
子组件数据展示
<button v-on:click="show_parent">子组件点击</button>
</div>`
,
methods:{
show_parent:function(){
console.log(this.$parent.message)
}
}
})
var parent_area = new Vue({
el:".parent_area",
data:{
message:'父级组件实例数据'
}
})

③访问子组件实例或子元素

    <!-- 访问子组件实例或子元素  -->
<div class="child_area">
<child-com></child-com>
</div>
/* 访问子组件实例或子元素 */
Vue.component('child-component',{
template:"<span>我是子组件实例</span>"
})
Vue.component('child-com',{
template:`
<div>
姓名:<input type="text" placeholder="请输入您的姓名"/>
<button v-on:click="getInfo">获取子组件</button>
<child-component ref="childSpan"></child-component>
</div>
`
,
methods:{
getInfo:function(){
console.log(this.$refs.childSpan);
}
}
});
new Vue({
el:".child_area"
})

④依赖注入

使用 $parent 属性无法很好的扩展到更深层级的嵌套组件上。这也是依赖注入的用武之地,它用到了两个新的实例选项:provide和 inject

 provide 选项允许我们指定我们想要提供给后代组件的数据/方法。然后在任何后代组件里,我们都可以使用 inject 选项来接收指定的我们想要添加在这个实例上的属性。

这允许我们更好的持续研发该组件,而不需要担心我们可能会改变/移除一些子组件依赖的东西。同时这些组件之间的接口是始终明确定义的,就和 props 一样。

实际上,你可以把依赖注入看作一部分“大范围有效的 prop”,除了:

  • 祖先组件不需要知道哪些后代组件使用它提供的属性
  • 后代组件不需要知道被注入的属性来自哪里

 简单demo:

// 父级组件提供 'foo'
var Provider = {
provide: {
foo: 'bar'
},
// ...
} // 子组件注入 'foo'
var Child = {
inject: ['foo'],
created () {
console.log(this.foo) // => "bar"
}
// ...
}

依赖注入demo案例:

    <div class="child_area">
<child-com></child-com>
</div>
Vue.component('child-component',{
template:`<span>我是子组件实例</span>`,
inject: ['info1','info2','info3','info4'],
/* 生命周期钩子 */
beforeCreate(){
console.log(this.info1);
},
created(){
console.log(this.info2);
},
beforeMount(){
console.log(this.info3);
},
mounted(){
console.log(this.info4);
}
})
Vue.component('child-com',{
template:`
<div>
父级组件实例
<child-component></child-component>
</div>
`
,
methods:{
getInfo:function(){
console.log(this.$refs.childSpan);
}
},
provide:{
info1:"提供依赖--组件实例刚被创建",
info2:"提供依赖--组件实例创建完成",
info3:"提供依赖--模板挂载之前",
info4:"提供依赖--模板挂载之后"
}
});
new Vue({
el:".child_area"
})
</script>

具体生命周期钩子,详看文章Vue2.0 —生命周期和钩子函数

(2)程序化的事件侦听器(待验证-了解即可)

(3)循环引用(待验证-了解即可)

(4)模板定义的替代品(待验证-了解即可)

.

vue组件---边界处理情况的更多相关文章

  1. Vue组件(知识)

    form最后一节. 组件基础 组件的复用:  data必须是函数 组织 通过Prop向子组件传递data 单个根元素 通过event向父组件发送消息: 使用事件抛出一个value, 在组件上用v-mo ...

  2. vue组件最佳实践

    看了老外的一篇关于组件开发的建议(强烈建议阅读英文原版),感觉不错翻译一下加深理解. 这篇文章制定一个统一的规则来开发你的vue程序,以至于达到一下目的. 1.让开发者和开发团队更容易发现一些事情. ...

  3. JS组件系列——又一款MVVM组件:Vue(二:构建自己的Vue组件)

    前言:转眼距离上篇 JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查) 已有好几个月了,今天打算将它捡起来,发现好久不用,Vue相关技术点都生疏不少.经过这几个月的时间,Vue ...

  4. 【Vue】详解Vue组件系统

    Vue渲染的两大基础方式 new 一个Vue的实例 这个我们一般会使用在挂载根节点这一初始化操作上: new Vue({ el: '#app' }) 注册组件并使用—— 全局注册 通过Vue.comp ...

  5. Vue组件选项props

    前面的话 组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props ...

  6. Vue组件库的那些事儿,你都知道吗?

    前段时间一直在研究Vue组件库,终于在组内派上了用场.来给大家贡献一篇关于Vue组件库的相关知识.经验不多,如果有不合理的地方还请多多指出哦--- 回想一下,在你们公司或者你们小组是否有一个以上的项目 ...

  7. 【vue系列之三】从一个vue-pdf-shower,说说vue组件和npm包

    前言 从去年年初开始,自己便下决心要写一个vue系列的博客,但时至今日,才写系列的第三篇博客,想来甚是惭愧. 但是慢归慢,每一篇都要保证质量,以及要写出自己的心路历程,防止自己工作中填的坑再让读者走一 ...

  8. Vue (三) --- Vue 组件开发

    ------------------------------------------------------------------好心情,会让你峰回路转. 5. 组件化开发 5.1 组件[compo ...

  9. vue 组件开发、vue自动化工具、axios使用与router的使用(3)

    一. 组件化开发 1.1 组件[component] 在网页中实现一个功能,需要使用html定义功能的内容结构,使用css声明功能的外观样式,还要使用js定义功能的特效,因此就产生了一个功能先关的代码 ...

随机推荐

  1. Android Jni层 创建 linux socket 出错问题解决

    问题: 想在Jni层创建 udp socket 与服务端通信,可是没有成功.最后发现居然是创建socket失败(代码例如以下) // create socket g_sd = socket(AF_IN ...

  2. 2015/12/29 Java语言概述 操作中注意事项

    java语言概述 ①版本分类:JavaSE 标准版 桌面开发                 JavaEE 企业版 网络开发                 JavaME 移动版 嵌入式开发(塞班系统 ...

  3. shell脚本自动更新git

    gitpull.sh #!/bin/bash cd /home/wwwroot/default/mouse && git pull cd /home/wwwroot/default/s ...

  4. xUnit随笔

    XUnit入门 1.如果之前安装了xUnit.net Visual Studio Runner扩展包,通过"工具"菜单下的"扩展和更新"先将该扩展包卸载. 2. ...

  5. Eclipse中直接执行sql语句(图文说明)

    转自:https://blog.csdn.net/changjyzzu/article/details/45487847 1.首先新建sql文件,然后打开文件 22.右键点击空白处,点击set-con ...

  6. nginx - ubutun下安装nginx(详述编译方法)

    一.使用apt命令安装 sudo apt-get install nginx 二.编译方法安装(个人实践方法,具体见官方文档) 1)说明:我使用的虚拟机是64位 ubuntu server14.04, ...

  7. Unity项目 - Boids集群模拟算法

    1987年Craig W.Reynolds发表一篇名为<鸟群.牧群.鱼群:分布式行为模式>的论文,描述了一种非常简单的.以面向对象思维模拟群体类行为的方法,称之为 Boids ,Boids ...

  8. Codeforces 1131 (div 2)

    链接:http://codeforces.com/contest/1131 A Sea Battle 利用良心出题人给出的图,不难看出答案为\(2*(h1+h2)+2*max(w1,w2)+4\)由于 ...

  9. 题解报告:hdu 2717 Catch That Cow(bfs)

    Problem Description Farmer John has been informed of the location of a fugitive cow and wants to cat ...

  10. AOP面向方面编程---postsharp

    PostSharp是一个用于在.NET平台上实现AOP(Aspect-Oriented Programming,面向方面编程)的框架,现通过简单的示例代码来演示如何使用postsharp. 1.新建一 ...