全局API
extend创建的是一个组件构造器,而不是一个具体的组件实例
//选项对象 baseOptions
let baseOptions= {
template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
data: function () {
return {
firstName: 'Walter',
lastName: 'White',
alias: 'Heisenberg'
}
},
created(){
console.log('onCreated-1');
}
};
使用:
1、extend常服务于Vue.component用来生成组件,这是注册全局组件,可以在任意实例的components里使用。
使用示例:全局提示组件,全局的网页底部,动态创建全局组件(插件 ),用Vue.extend构建消息提示组件。(网页底部组件:创建的组件的dom结构,直接在body底部插入,在vue的app实例范围外,创建之后,该组件仍然可以响应组件内的数据。)
Vue.component('global-component', Vue.extend(baseOptions));
//传入一个选项对象(自动调用 Vue.extend),等价于上行代码.
Vue.component('global-component', baseOptions);
2、Vue.extend只是创建一个构造器,他是为了创建可复用的组件,在其它地方可以直接new。而mixins,extends是为了扩展组件属性,采用的方式是混合选项对象baseOptions
let BaseComponent = Vue.extend(baseOptions);
//基于基础组件BaseComponent,再扩展新逻辑.
new BaseComponent({
created(){
//do something
console.log('onCreated-2');
}
//其他自定义逻辑
});
// -> onCreated-1
// -> onCreated-2
它的混入规则,和mixins一样。详细查阅vue实例属性总结:根实例和组件实例
new Vue({
mixins: [baseOptions],
created(){
//do something
console.log('onCreated-2');
}
//其他自定义逻辑
});
// -> onCreated-1
// -> onCreated-2
extends:声明扩展另一个组件(可以是一个简单的选项对象或构造函数)。这主要是为了便于扩展单文件组件,与mixins 类似,剩下的差别大概是mixins接受数组,它是选项对象。
new Vue({
extends: baseOptions,
created(){
//do something
console.log('onCreated-2');
}
//其他自定义逻辑
});
// -> onCreated-1
// -> onCreated-2
3、创建一个vue的“子类”,使用new extend的构造函数,注册局部组件(局部组件也可以是单文件组件,使用导入的方式注册),局部组件在子组件中不可用。参数与Vue一样,注意:data选项是函数,没有el等实例才有的选项。new的实例使用的propsData,而不是props。
var author = Vue.extend({
template: "<p><a :href='url'>{{author}} & {{name}}</a></p>",
data : function() {
return {
author : 'vamous',
url : 'http://blog.csdn.net/Dear_Mr/article/details/72614370'
}
},
props : ['name']
});
//对应html:自定义无参数标签
<author></author>
//必须要挂载才可以使用
//使用propsData给实例的props传递参数
new author({propsData: {name : 'dear_mr'}}).$mount('author');
//对应html还可以是普通标签
<div id="author"></div>
//挂载方式
new author().$mount('#author');
extend写法不但要创建构造器,还要new一个实例,还要挂载到特定的元素上,这个特定元素最终还被完全替换了,不像component用起来那么舒服,注册好特定的名字之后,想在哪里用,就在哪里写组件名,程序还更易读。
所以说extend到底有什么优势呢?
生成的实例并不一定要"挂载到一个元素上"。
也就是 new 实例().$mount() 的参数可以为空,但他依旧能生成一个实例。生成的实例里面有$el这个参数,通过document.body.appendChild( 实例.$el),这个dom想插哪里插哪里。
component是extend的亲民版,但在实现某些特殊需求的时候,就需要用到extend,如alert组件,你肯定希望alert可以动态插入到body中,而不需要在dom文档流中放一个莫名其妙的alert,大部分时间他还是隐藏的。
Vue.nextTick( [callback, context] ):从2.1起,返回一个promise。在下次 DOM 更新循环结束之后(这是个什么场景?)执行延迟回调(这个回调在哪里传入?)。在修改数据之后立即使用这个方法,获取更新后的 DOM(获取拿来干嘛?)。
Vue.set( target, key, value ):向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。注意对象不能是 Vue 实例,或者 Vue 实例的根数据对象。
在实例上的调用形式:vm.$set
使用场景:
1、vm实例创建后新添属性。
2、Vue 不能检测以下变动的数组(vue能检测到并触发视图更新的方法):
a、当利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
解决:
(1)Vue.set(vm.items, indexOfItem, newValue)
(2)vm.items.splice(indexOfItem, 1, newValue)
(3)vm.$set(vm.items, indexOfItem, newValue)
b、当修改数组的长度时,例如:vm.items.length = newLength
解决:vm.items.splice(newLength)
Vue.delete( target, key ):删除对象的属性。如果对象是响应式的,确保删除能触发更新视图。这个方法主要用于避开 Vue 不能检测到属性被删除(这句话什么意思?),但是你应该很少会使用它。目标对象不能是一个 Vue 实例或 Vue 实例的根数据对象。
Vue.directive( id, [definition] ):注册或获取全局指令,见自定义指令。
//返回已注册的指令
var myDirective = Vue.directive('my-directive')
Vue.filter( id, [definition] ):注册或获取全局过滤器,查看博文vue构造器参数之filters过滤器。
Vue.component( id, [definition] ):注册或获取全局组件,Vue.component类是Vue类的子类,第一个参数是组件名称,建议使用小写+‘-’的形式,在使用时,也是这个形式。
// 注册组件,传入一个扩展过的构造器
Vue.component('my-component', Vue.extend({ /* ... */ })) // 注册组件,传入一个选项对象 (自动调用 Vue.extend),等价于上行代码.
Vue.component('my-component', { /* ... */ }) // 获取注册的组件 (始终返回构造器)
var MyComponent = Vue.component('my-component')
基础组件的自动化全局注册:解决每个文件一长串的import基础组件
import BaseButton from './BaseButton.vue'
import BaseIcon from './BaseIcon.vue'
import BaseInput from './BaseInput.vue'
自动注册,在new根实例之前:
使用 require.context 全局注册通用的基础组件。这里有一份可以让你在应用入口文件 (比如 src/main.js) 中全局导入基础组件的示例代码:
import Vue from 'vue'
import upperFirst from 'lodash/upperFirst'
import camelCase from 'lodash/camelCase' const requireComponent = require.context(
// 其组件目录的相对路径
'./components',
// 是否查询其子目录
false,
// 匹配基础组件文件名的正则表达式
/Base[A-Z]\w+\.(vue|js)$/
) requireComponent.keys().forEach(fileName => {
// 获取组件配置
const componentConfig = requireComponent(fileName) // 获取组件的 PascalCase 命名
const componentName = upperFirst(
camelCase(
// 剥去文件名开头的 `./` 和结尾的扩展名
fileName.replace(/^\.\/(.*)\.\w+$/, '$1')
)
) // 全局注册组件
Vue.component(
componentName,
// 如果这个组件选项是通过 `export default` 导出的,
// 那么就会优先使用 `.default`,
// 否则回退到使用模块的根。
componentConfig.default || componentConfig
)
})
Vue.use( plugin ):安装 Vue.js 插件,包括个人组件/插件。该方法需要在调用 new Vue() 之前被调用。
Vue.js 官方提供的一些插件 (例如 vue-router) 在检测到 Vue 是可访问的全局变量时会自动调用 Vue.use()。然而在例如 CommonJS 的模块环境中,要显式地调用 Vue.use()
Vue.compile( template ):编译的意思,在 render 函数(渲染函数)中编译模板字符串。只在独立构建时有效。
var res = Vue.compile('<div><span>{{ msg }}</span></div>')
new Vue({
data: {
msg: 'hello'
},
render: res.render,
staticRenderFns: res.staticRenderFns
})
Vue.observable( object ):返回的对象可以直接用于渲染函数和计算属性内,并且会在发生改变时触发相应的更新。
在 Vue 3.x 中,返回一个可响应的代理,而对源对象直接进行修改仍然是不可响应的。因此,推荐操作返回的对象,而不是源对象。
全局API的更多相关文章
- vuejs全局api
全局api set 增加数组 vm.$set 实例化方法 全局api delete 删除数组 vm.$delete 实例化方法 全局 api 组件component 实例化方法 components ...
- AngularJS学习之全局API(应用程序编程接口)
1.AngularJS全局API用于执行常见任务的Javascript函数集合: **比较对象 **迭代对象 **转换对象 2.全局API函数使用angularJS对象进行访问:以下是通用API函数: ...
- Vue基础(环境配置、内部指令、全局API、选项、内置组件)
1.环境配置 安装VsCode 安装包管理工具:直接下载 NodeJS 进行安装即可,NodeJS自带 Npm 包管理工具,下载地址:https://nodejs.org/en/download/安装 ...
- vue文档全局api笔记1
全局api方法 1.Vue.extend(options) 请注意,extend创建的是一个组件构造器,而不是一个具体的组件实例.所以他不能直接在new Vue中这样使用: new Vue({comp ...
- vuejs全局api概念
什么是全局API? 全局API并不在构造器里,而是先声明全局变量或者直接在Vue上定义一些新功能,Vue内置了一些全局API,比如我们今天要学习的指令Vue.directive.说的简单些就是,在构造 ...
- API(全局配置,全局API)
全局配置 Vue.config是一个对象,包含Vue的全局配置 silent 类型:boolean 默认值:false 用法 Vue.config.silent=true 取消Vue所有的日志与警告 ...
- Vue源码探究-全局API
Vue源码探究-全局API 本篇代码位于vue/src/core/global-api/ Vue暴露了一些全局API来强化功能开发,API的使用示例官网上都有说明,无需多言.这里主要来看一下全局API ...
- Vue 2.0入门基础知识之全局API
3.全局API 3-1. Vue.directive 自定义指令 Vue.directive用于自定义全局的指令 实例如下: <body> <div id="app&quo ...
- vue API 知识点(1)---全局 API 总结
1.Vue.extend(options) 构造器,创建一个 子类 .参数是一个包含组件选项的对象 data 选项是特例,需要注意 在 Vue.extend() 中它必须是一个函数, <div ...
- Vue3全局APi解析-源码学习
本文章共5314字,预计阅读时间5-15分钟. 前言 不知不觉Vue-next的版本已经来到了3.1.2,最近对照着源码学习Vue3的全局Api,边学习边整理了下来,希望可以和大家一起进步. 我们以官 ...
随机推荐
- 逆向-攻防世界-CSAW2013Reversing2
运行程序乱码,OD载入搜索字符串,断电到弹窗Flag附近. 发现跳过00B61000函数,弹窗乱码,我们试试调用00B61000函数.将00B61094的指令修改为JE SHORT 00B6109b. ...
- Spring Boot与缓存
---恢复内容开始--- JSR-107.Spring缓存抽象.整合Redis 一.JSR107 Java Caching定义了5个核心接口,分别是CachingProvider, CacheMana ...
- (六)jdk8学习心得之Stream流
六.Stream流 1. 什么是stream流 现阶段,可以把stream流看成一个高级版的Iterator.普通的Iterator只能实现遍历,遍历做什么,就需要具体些功能代码函数了.而这个stre ...
- 使用sqlserver 链接远程服务器进行查询
--创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogi ...
- 3 Eclipse 查看不了源码
Eclipse 查看源码时,报source not found问题,经查资料,需要配置环境变量才能查看到. 在用户变量或者系统变量下,配置CLASSPATH,值为JDK的lib路径:D:\Progra ...
- [转帖]Windows7/2008中批量删除隧道适配器的方法
https://www.jb51.net/os/windows/479838.html 客户现场的硬件信息总是发生变化 这里查找一下资料 尝试一下. 1.在网卡属性的“网络”中,将“Internet协 ...
- XPath、CSS 选择器 -学习地址
http://www.w3school.com.cn/cssref/css_selectors.asp http://www.w3school.com.cn/xpath/xpath_syntax.as ...
- Kafka如何保证消息的可靠性传输
1.消费端弄丢了数据 唯一可能导致消费者弄丢数据的情况,就是说,你消费到了这个消息,然后消费者那边自动提交了 offset,让 Kafka 以为你已经消费好了这个消息,但其实你才刚准备处理这个消息,你 ...
- Leetcode 5
HashTable Easy 1. 136. Single Number 0与0异或是0,1与1异或也是0,那么我们会得到0 class Solution { public: int singleNu ...
- Floyd-蒟蒻也能看懂的弗洛伊德算法(当然我是蒟蒻)
今天来讲点图论的知识,来看看最短路径的一个求法(所有的求法我以后会写,也有可能咕咕咕) 你们都说图看着没意思不好看,那今天就来点情景 暑假,_GC准备去一些城市旅游.有些城市之 ...