vue组件---边界处理情况
(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组件---边界处理情况的更多相关文章
- Vue组件(知识)
form最后一节. 组件基础 组件的复用: data必须是函数 组织 通过Prop向子组件传递data 单个根元素 通过event向父组件发送消息: 使用事件抛出一个value, 在组件上用v-mo ...
- vue组件最佳实践
看了老外的一篇关于组件开发的建议(强烈建议阅读英文原版),感觉不错翻译一下加深理解. 这篇文章制定一个统一的规则来开发你的vue程序,以至于达到一下目的. 1.让开发者和开发团队更容易发现一些事情. ...
- JS组件系列——又一款MVVM组件:Vue(二:构建自己的Vue组件)
前言:转眼距离上篇 JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查) 已有好几个月了,今天打算将它捡起来,发现好久不用,Vue相关技术点都生疏不少.经过这几个月的时间,Vue ...
- 【Vue】详解Vue组件系统
Vue渲染的两大基础方式 new 一个Vue的实例 这个我们一般会使用在挂载根节点这一初始化操作上: new Vue({ el: '#app' }) 注册组件并使用—— 全局注册 通过Vue.comp ...
- Vue组件选项props
前面的话 组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props ...
- Vue组件库的那些事儿,你都知道吗?
前段时间一直在研究Vue组件库,终于在组内派上了用场.来给大家贡献一篇关于Vue组件库的相关知识.经验不多,如果有不合理的地方还请多多指出哦--- 回想一下,在你们公司或者你们小组是否有一个以上的项目 ...
- 【vue系列之三】从一个vue-pdf-shower,说说vue组件和npm包
前言 从去年年初开始,自己便下决心要写一个vue系列的博客,但时至今日,才写系列的第三篇博客,想来甚是惭愧. 但是慢归慢,每一篇都要保证质量,以及要写出自己的心路历程,防止自己工作中填的坑再让读者走一 ...
- Vue (三) --- Vue 组件开发
------------------------------------------------------------------好心情,会让你峰回路转. 5. 组件化开发 5.1 组件[compo ...
- vue 组件开发、vue自动化工具、axios使用与router的使用(3)
一. 组件化开发 1.1 组件[component] 在网页中实现一个功能,需要使用html定义功能的内容结构,使用css声明功能的外观样式,还要使用js定义功能的特效,因此就产生了一个功能先关的代码 ...
随机推荐
- expand_dims
tf.expand_dims | TensorFlow https://tensorflow.google.cn/api_docs/python/tf/expand_dims tf.expand_ ...
- 记一次ORA-600[13011]
SunOS 5.10 Oracle 10.2.0.2.0 开发环境某一数据库出现ora-600报错. alert.log中的报错信息: Thu Nov 13 15:11:43 2014 Errors ...
- 中国剩余定理模板&俄罗斯乘法
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, ...
- Java 系统工具类 —— System、Scanner、Runtime
0. 静态成员变量 System.out:是 PrinterStream 型变量: public final class System { ... public final static InputS ...
- 【前端】window.resize的优化
一.概述 window.resize事件会在窗口尺寸改变的时候触发,哪怕只是改变了1像素.所以当窗口进行拖动的时候会触发很多次,很容易就卡死. 虽然部分浏览器已经进行了一点优化,但这还不够. 二.优化 ...
- 列表渲染v-for
v-for我们用v-for指令根据一组数据的选项列表进行渲染.v-for指令需要以item in items形式的特殊语法,items是源数据数组并且item是数组元素迭代的别名. demo: < ...
- springAOP配置XML方式配置切面报错error at ::0 formal unbound in pointcut
[错误配置文件] <aop:config> <aop:pointcut expression="execution(* net.fifteenho.service.impl ...
- IDEA Artifacts问题
如果你使用的IDEA并且无论如何都ClassNotFound异常的话,可以看看其中一种可能的解决方案 第一步:打开Project Struture-->Modules-->点击项目--&g ...
- Python机器学习算法 — 支持向量机(SVM)
SVM--简介 <α∗j<C,可得: 构造决策函数: 5.求最优解 要求解的最优化问题如下: 考虑使用序列最小最优化算法(SMO,se ...
- MvcPager 分页控件
官方教程: http://www.webdiyer.com/mvcpager