目录
一、render函数
需要js完全编程能力,比模板更接近编译器,编译模板,使用render函数我们可以用js语言来构建DOM,因为vue是虚拟DOM,所以在拿到template模板时也要转译成VNode的函数,而用render函数构建DOM,vue就免去了转译的过程。
render(createElement){
return createElement(标签名称,{},子节点数组)
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
<my-a :level="1">
hello World
</my-a>
</div>
<script>
let myA = {
props:['level'],
data() {
return {
msg:'myA组件',
arrs:[
{id:1,name:'terry'},
{id:2,name:'larry'},
{id:3,name:'ronda'}
]
}
},
// JSX Javascript + xml
// let a = <div></div>
// template:`
// <div>
// myA组件
// <h1 v-if='level===1'>
// <slot></slot>
// <h1>
// <h2 v-if='level===2'>
// <slot></slot>
// <h2>
// <h3 v-if='level===3'>
// <slot></slot>
// <h3>
// </div>
// `
render(createElement){
// 创建节点描述 createElement(html标签,{元素属性,配置},[子节点数组])
// return createElement('h'+this.level,{},[this.$slots.default])
// return createElement('div',{},this.msg)
let lis = this.arrs.map(item=>{
return createElement('li',{},item.name)
})
return createElement('div',{
class:['active','error'],
style:{
color:'pink',
fontSize:'28px'
}
},[this.$slots.default,...lis])
}
}
new Vue({
el:"#app",
components:{
'my-a':myA
},
data:{
},
methods: {
},
})
</script>
</body>
</html>
浏览器运行结果如下:
二、过滤器
格式化文本,时间都可以使用过滤器,使用在双花括号内部,使用在v-bind表达式
全局注册过滤器
// 全局注册过滤器 filter(过滤器名称,格式化函数)
Vue.filter('capitalize', function (val,a,b) {
console.log(val,a,b,'需要格式化文本');
return val.charAt(0).toUpperCase() + val.slice(1)
})
局部注册过滤器
new Vue({
el: "#app",
// 局部注册过滤器
filters: {
'fmtDate'(val){
return moment(val).format('YYYY-MMMM-Do HH:mm:ss a')
},
'lowerCase'(val){
return val.charAt(0).toLowerCase() + val.slice(1)
}
},
data: {
msg: 'hello vue',
time:new Date().getTime()
},
methods: {
},
})
过滤器使用
<!-- 过滤器: 常见文本格式化 时间格式化 -->
<!-- 使用: 格式化文本 | 过滤器名称 -->
{{msg | capitalize}}
串联使用
<!-- 过滤器串联使用 -->
{{msg | capitalize | lowerCase}}
<div v-bind:title="msg | capitalize">我是div</div>
{{time | fmtDate}}
过滤器js函数,可以传递参数
<!-- 使用过滤器的同时传递参数 -->
{{msg | capitalize('hello',{name:'terry'})}}
三、插件
添加Vue的全局功能,开发插件必须暴露install方法
插件作用:
为Vue添加全局功能(指令、过滤器、全局方法、实例方法、第三方库)
开发插件:
// 开发插件 ----> 插件暴露install方法
let myPlugin = {
install(Vue,options){
// console.log(Vue,options);
// Vue构造函数全局方法 静态方法
Vue.Method = function(val){
alert(val)
}
// 全局注册自定义指令
Vue.directive('focus',{
inserted(el){
el.focus()
}
})
// 全局注册过滤器
Vue.filter('capitaliza',function(val){
return val.charAt(0).toUpperCase() + val.slice(1)
})
// 注册实例方法
Vue.prototype.$message = function(val){
alert(val)
}
}
}
使用插件:
// 使用插件 ----> 在new Vue之前调用
Vue.use(myPlugin)