本篇文章是我根据vue官方文档所整理的一篇文章,便于观看,因为我还是初学者,有不对的地方多多指教。
一. 全局API
1. Vue.directive
用来注册自定义指令,对低级DOM元素进行访问,为DOM元素添加新的特性。
控制
input
文本框是否自动获取焦点。
<body>
<div id="app">
<input type="text" v-focus="true"/>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.directive("focus", {
inserted(el, binding) {
if(binding.value) {
el.focus()
}
}
})
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
2. Vue.use
Vue.use
主要用于在Vue中安装插件,通过插件可以为Vue添加全局功能。插件可以是一个对象或函数,如果是对象,必须提供install()
方法,用来安装插件;如果是一个函数,则该函数将被当成install()
方法。
Vue.js官方提供的一些插件(如
vue-router
)在检测到Vue是可访问的全局变量时,会自动调用Vue.use()
。但是在CommonJS等模块的环境下,则始终需要Vue.use()
显示调用。
<body>
<div id="app" v-my-directive></div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
let MyPlugin = {};
MyPlugin.install = function(Vue, options) {
console.log(options);
Vue.directive('my-directive', {
bind(el, binding) {
el.style = 'width:100px; height:100px; background-color:#ccc'
}
})
}
Vue.use(MyPlugin, {
someOption: true
})
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
3. Vue.extend
Vue.extend
用于基于Vue构造器创建一个Vue子类,可以对Vue构造器进行扩展。它有一个options
参数,表示组件选项的对象。
<body>
<div id="app1">app1:{{title}}</div>
<div id="app2">app2:{{title}}</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
var Vue2 = Vue.extend({
data() {
return {
title: 'hello'
}
}
})
var vm1 = new Vue({
el: '#app1'
})
var vm2 = new Vue2({
el: '#app2'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
4. Vue.set
Vue的核心具有一套响应式系统,简单来说就是通过监听器监听数据层的数据变化,当数据改变后,通知视图也自动更新。
Vue.set
用于向响应式对象中添加一个属性,并确保这个新属性同样式响应式的,且触发视图更新。
<body>
<div id="app">
<div>{{a}}</div>
<div>{{obj.b}}</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
var vm = new Vue({
el: '#app',
data: {
a: '我是根级响应式属性a',
obj: {}
}
})
Vue.set(
vm.obj,
'b',
'我是Vue.set添加的响应式属性obj.b'
)
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
5. Vue.mixin
Vue.min
用于全局注册一个混入,它将影响之后创建的每个Vue实例。该接口主要是提供给插件作者使用,在插件中向组件注入自定义的行为。该接口不推荐在应用代码中使用。
<body>
<div id="app"></div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.mixin({
created() {
var myOption = this.$options.myOption
if(myOption) {
console.log(myOption.toUpperCase());
}
}
})
var vm = new Vue({
myOption: 'hello vue!'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
二. Vue实例
1. vm.$props
$props
:使用vm.$props
属性可以接收上级组件向下传递的数据。
当输入框中输入手机品牌,下面列表中即出现对应的手机信息。
<body>
<div id="app">
<!-- 父组件 -->
<my-parent></my-parent>
</div>
<!-- 父组件模板 -->
<template id="parent">
<div>
<h3>手机信息搜索</h3>
手机品牌:<input type="text" v-model="brand">
<!-- 子组件 -->
<my-child :name="brand"></my-child>
</div>
</template>
<!-- 子组件模板 -->
<template id="child">
<ul>
<li>手机品牌:{{show.brand}}</li>
<li>手机型号:{{show.type}}</li>
<li>市场价格:{{show.price}}</li>
</ul>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.component('MyParent', {
template: '#parent',
data() {
return {
brand: ''
}
}
})
Vue.component('MyChild', {
template: '#child',
data() {
return {
content: [
{brand: '华为', type: 'Mate20', price: 3699},
{brand: '苹果', type: 'iPhone7', price: 2949}
],
show: {
brand: '', type: '', price: ''
}
}
},
props: ['name'],
watch: {
name() {
if(this.$props.name) {
var found = false;
this.content.forEach((value, index) => {
if(value.brand === this.$props.name) {
found = value
}
})
this.show = found ? found : {brand: '', type: '', price: ''}
}else {
return
}
}
}
})
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
2. vm.$options
Vue实例初始化时,除了传入指定的选项外,还可以传入自定义选项。自定义选项的值可以是数组、对象、函数等,通过vm.$options
来获取。
<body>
<div id="app">
<p>{{base}}</p>
<p>{{noBase}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
var vm = new Vue({
el: '#app',
data: {
base: '我是基础数据'
},
customOption: '我是自定义数据',
created() {
this.noBase = this.$options.customOption
}
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
3. vm.$el
vm.$el
用来访问vm实例使用的根DOM元素。
<body>
<div id="app">
<p>我是根标签结构</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
var vm = new Vue({
el: '#app'
})
vm.$el.innerHTML = '<div>我是替换后的div标签</div>'
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
4. vm.$children
查看直接子组件。
<body>
<div id="app">
<button @click="child">查看子组件</button>
<my-component></my-component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.component('MyComponent', {
template: `
<div>myCompontent</div>
`
})
var vm = new Vue({
el: '#app',
methods: {
child() {
console.log(this.$children);
}
}
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
5. vm.$root
vm.$root
用来获取当前组件树的根Vue实例,如果当前实例没有父实例,则获取到的是该实例本身。
<body>
<div id="app">
<my-component></my-component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.component('MyComponent', {
template: `
<button @click="root">查看根实例</button>
`,
methods: {
root() {
console.log(this.$root);
console.log(this.$root === vm.$root);
}
}
})
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
6. vm.$slots
Vue的组件中使用template
模板定义HTML结构,为了方便使用template
公共模板结构。Vue提出了插槽(Slots)的概念,插槽就是定义在组件内部的template
模板,可以通过$slots
动态获取。
示例一:通过<slot></slot>
展示组件的内容
</head>
<body>
<div id="app">
<my-component>你好</my-component>
</div>
<template id="first">
<div>
<slot></slot>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.component('MyComponent', {
template: '#first'
})
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
示例二:通过v-slot
定义插槽对象
<body>
<div id="app">
<my-component>你好
<template v-solt:second>
<div>内部结构</div>
</template>
</my-component>
</div>
<template id="first">
<div>
<slot></slot>
</div>
</template>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.component('MyComponent', {
template: '#first'
})
var vm = new Vue({
el: '#app'
})
// 在控制台查看插槽内容
console.log(vm.$children[0].$slots.default[1].children[0].text);
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
6. vm.$attrs
vm.$attrs
可以获取组件的属性,但其获取的属性中不包含class
、style
以及被声明的props
属性。
<body>
<div id="app">
<my-component id="test"></my-component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.component('MyComponent', {
template: `
<button @click="showAttrs">查看属性</button>
`,
methods: {
showAttrs() {
console.log(this.$attrs);
}
}
})
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
三. 全局配置
1. productionTip
Vue.config.productionTip
打开或关闭生产信息提示信息,默认为打开状态。
打开生产信息提示信息
<body>
<div id="app"></div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = true
</script>
</body>
关闭生产信息提示信息
<body>
<div id="app"></div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
2. silent
Vue.config.silent
可以取消Vue日志和警告,默认为false
,开启警告功能。
不取消Vue日志和警告
<body>
<div id="app">{{msg}}</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.config.silent = false
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
取消Vue日志和警告
<body>
<div id="app">{{msg}}</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.config.silent = true
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
3. devtools
Vue.config.devtools
表示打开或关闭vue-devtools调试工具。开发版本默认为true
,生产版本默认为 false
。生产版本设为true
可以启用检查。
启用检查
<body>
<div id="app"></div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.config.devtools = true
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
关闭检查
<body>
<div id="app"></div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.config.devtools = false
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
四. 组件进阶
1. mixins
mixins
是一种分发Vue组件中可复用功能的方式;mixins
对象可以包含任何组件选项,将定义的mixins
对象引入组件中即可使用,mixins
中的所有选项将会混入到组件自己的选项中。
<body>
<div id="app"></div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
var myMixin = {
created() {
this.hello()
},
methods: {
hello() {
console.log('hello form mixin!');
}
}
}
var Component = Vue.extend({
mixins: [myMixin]
})
var component = new Component()
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
2. render
render()
渲染函数:在Vue中可以使用Vue.render()
实现对虚拟DOM的操作。在Vue中一般使用template
来创建HTML,但这种方式可编程性不强,而使用Vue.render()
可以更好地发挥JavaScript的编程能力。
<body>
<div id="app">
<my-component>成功渲染</my-component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.component('MyComponent', {
render(createElement) {
return createElement('p', {
style: {
color: 'red',
fontSize: '16px',
backgroundColor: '#eee'
}
}, this.$slots.default)
}
})
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>
3. createElement
createElement
:createElement()
函数返回的并不是一个实际的DOM元素,它返回的其实是一个描述节点(createNodeDescription
)。
- 第1个参数可以是一个HTML标签名或组件选项对象;
- 第2个参数是可选的,可以传入一个与模板中属性对应的数据对象;
- 第3个参数是由createElement()构建而成的子级虚拟节点,也可以使用字符串来生成文本虚拟节点。
<body>
<div id="app">
<my-component>
<template v-slot:header>这里是导航栏</template>
<template v-slot:content>这里是图书展示信息</template>
<template v-slot:footer>这里是底部信息</template>
</my-component>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script>
Vue.component('MyComponent', {
render(createElement) {
return createElement('div', [
createElement("header", this.$slots.header),
createElement("content", this.$slots.content),
createElement("footer", this.$slots.footer)
])
}
})
var vm = new Vue({
el: '#app'
})
Vue.config.productionTip = false // 阻止vue在启动时生成生产提示
</script>
</body>