写在前面:说实话视频学习的方式真的不适合我...以前在B站和慕课上的Vue视频学的组件啊Vuex啊router真的只是囫囵吞枣啊,会用是会用,可是呆的很。html
仍是纸质适合我,应该这一周就能复习完Vuex和router了,冲!vue
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="Vue.2.6.10.js"></script>
</head>
<body>
<div id="app1">
<smart-item :data='data'></smart-item>
<button @click='change("img")'>切换至图片组件</button>
<button @click='change("video")'>切换至视频组件</button>
<button @click='change("text")'>切换至文字组件</button>
</div>
</body>
<script>
//vue提供了一个functional的布尔值选项(注册组件时),若设置为true,则会使得组件无状态、无实例,即没有data、this上下文,这样使用render函数
//返回的虚拟节点能够更容易渲染,由于函数化的组件只是一个函数(即functional为true)
//图片组件选项
var imgComp = { props:['data'], render(h) { return createElement('div',[ createElement('p','图片组件'), createElement('img',{ attrs:{ src:this.data.url } }) ]); }, }; var videoComp = { props:['data'], render:function(createElement){ return createElement('div',[ createElement('p','视频组件'), createElement('video',{ attrs:{ src:this.data.url, controls:'controls', autoplay:'autoplay' } }) ]); } }; var textComp = { props:['data'], render:function(createElement){ return createElement('div',[ createElement('p','文本组件'), createElement('p',this.data.text) ]); } }; Vue.component('smart-item',{ //函数化组件
functional:true, render:function(createElement,context){//使用函数化组件时,render函数提供了第二个参数context
//来提供临时上下文,组件中须要的data、props、slots、children、parent都是经过它来传递的
//this.level---context.props.level, this.$slots.default---context.children
function getCom(){ var data = context.props.data; if(data.type === 'img') return imgComp; if(data.type === 'video') return videoComp; return textComp; }; return createElement( getCom(), { props:{ data:context.props.data//从组件smart-item传向上面getCom()返回的组件
} }, context.children//父组件插槽的默认内容
) }, props:{ data:{ type:Object, required:true } } }); var app1 = new Vue({ el:"#app1", data:{ data:{}//默认为对象嗷
}, methods: { change:function(type){ if(type === 'img'){ this.data = { type:'img', url:'' } }else if(type === 'video'){ this.data = { type:'video', url:'' } }else if(type === 'text'){ this.data = { type:'text', text:'文本组件,冲!' } } } }, created() { this.change('text'); }, }); //jsx是什么?它是一种看起来像html,但其实是js的语法扩展
// // createElement&jsx:
// render(createElement){
// return createElement('div',{
// props:{
// text:'some text'
// },
// attrs:{
// id:'myDiv'
// },
// domProps:{
// innerHTML:'content'
// },
// on:{
// change:this.change
// },
// nativeOn:{
// click:this.clickHandler
// },
// class:{
// show:true,
// on:false
// },
// style:{
// color:"#fff",
// background:'#f50'
// },
// key:'key',
// ref:'element',
// slot:'slot'
// })
// };//改写为jsx以下:
// render(h) {
// return {
// <div
// id='myDiv'
// domPropsInnerHTML='content'
// onChange = {this.change}
// class={{ show:true, on:false }}
// style = {{ ... }}
// }
// }
</script>
</html>