全局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,边学习边整理了下来,希望可以和大家一起进步. 我们以官 ...
随机推荐
- C++一些基本数据结构:字面常量、符号常量、枚举常量
常量:C++包括两种常量,字面常量和符号常量. 字面常量:指的是直接输入到程序中的值 比如:in myAge=26: myAge是一个int类型变量,而26是一个字面常量. 符号常量:指的是用名称表示 ...
- 二。Hibernate 查询 HQL、SQL方式
hibernate的查询1.HQL方式:所有查询都是根据java对象名来完成,对象名替换表名2.SQL方式:保留原来的sql查询风格3.可以通过设置第一条和最大条数来实现各种数据库的分页查询4.通过B ...
- 安装WebLogic失败,出现”[VALIDATION] [ERROR]:INST-07004: Oracle 主目录(O) 位置包含一个或多个无效字符“解决方案
题如图 解决方案: 在管理员cmd窗口定位到jdk bin目录,然后输入以下命令 java -jar F:\java\fmw_12.2.1.3.0_wls_quick_Disk1_1of1\fmw_1 ...
- 【动态规划】 EditDistance
思路参考: https://www.cnblogs.com/littlepanpc/p/7895810.html 代码参考:https://leetcode.com/problems/edit-dis ...
- Ajax 的优势和不足
Ajax 的优势 1. 不需要插件支持 Ajax 不需要任何浏览器插件,就可以被绝大多数主流浏览器所支持,用户只需要允许 JavaScript 在浏览器上执行即可. 2. 优秀的用户体验 这是 Aja ...
- loj121-动态图连通性
Solution 线段树分治, 然后直接在线段树上dfs, 在进入/回溯的过程中维护并查集的merge/split. 对于split操作, 可以在merge时按秩合并, 然后利用栈记录, split时 ...
- ios端阻止页面滚动露底
转自 http://www.eboy.me/archives/129: 在IOS端的微信中使用H5页面,页面滑动到底部时,再向上拉或页面在顶部时下拉,总会露出微信自带的底色:总是会让人不爽. 以下是一 ...
- [leetcode] 5.Longest Palindromic Substring-1
开始觉得挺简单的 写完发现这个时间超限了: class Solution: def longestPalindrome(self, s: str) -> str: # longest palin ...
- MySQ数据备份
MySQL备份概述 问题:备份和冗余有什么区别? 备份:能够防止由于机械故障以及人为操作带来的数据丢失,例如将数据库文件保存在了其它地方. 冗余:数据有多份冗余,但不等于备份,只能防止机械故障带来的数 ...
- flink部署操作-flink standalone集群安装部署
flink集群安装部署 standalone集群模式 必须依赖 必须的软件 JAVA_HOME配置 flink安装 配置flink 启动flink 添加Jobmanager/taskmanager 实 ...