(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. expand_dims

    tf.expand_dims  |  TensorFlow https://tensorflow.google.cn/api_docs/python/tf/expand_dims tf.expand_ ...

  2. 记一次ORA-600[13011]

    SunOS 5.10 Oracle 10.2.0.2.0 开发环境某一数据库出现ora-600报错. alert.log中的报错信息: Thu Nov 13 15:11:43 2014 Errors ...

  3. 中国剩余定理模板&俄罗斯乘法

    void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){ if(!b){d=a;x=1LL;y=0LL;} else {ex_gcd(b,a%b,d, ...

  4. Java 系统工具类 —— System、Scanner、Runtime

    0. 静态成员变量 System.out:是 PrinterStream 型变量: public final class System { ... public final static InputS ...

  5. 【前端】window.resize的优化

    一.概述 window.resize事件会在窗口尺寸改变的时候触发,哪怕只是改变了1像素.所以当窗口进行拖动的时候会触发很多次,很容易就卡死. 虽然部分浏览器已经进行了一点优化,但这还不够. 二.优化 ...

  6. 列表渲染v-for

    v-for我们用v-for指令根据一组数据的选项列表进行渲染.v-for指令需要以item in items形式的特殊语法,items是源数据数组并且item是数组元素迭代的别名. demo: < ...

  7. springAOP配置XML方式配置切面报错error at ::0 formal unbound in pointcut

    [错误配置文件] <aop:config> <aop:pointcut expression="execution(* net.fifteenho.service.impl ...

  8. IDEA Artifacts问题

    如果你使用的IDEA并且无论如何都ClassNotFound异常的话,可以看看其中一种可能的解决方案 第一步:打开Project Struture-->Modules-->点击项目--&g ...

  9. Python机器学习算法 — 支持向量机(SVM)

    SVM--简介 <α∗j<C,可得:          构造决策函数:  5.求最优解         要求解的最优化问题如下:          考虑使用序列最小最优化算法(SMO,se ...

  10. MvcPager 分页控件

    官方教程: http://www.webdiyer.com/mvcpager