slot 内容分发 插槽内可以包含任何模板代码(html 组件)
父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。
1. html 组件
Vue.component('alert-box', { template: ` <div class="demo-alert-box"> <strong>Error!</strong> <slot></slot> </div> ` }) Vue.component('hello', { template: ` <div class="hello"> <a>link</a> hello </div> ` }) Vue.prototype.isActiveId = 1; var myname = 'wj' /* eslint-disable no-new */ new Vue({ el: '#app', // router, // store, // components: { App }, // template: '<App/>' // render:function(h){ // return h('hello') // } template:`<alert-box> <hello /> <p>my power</p> Something bad happened. </alert-box>` })
2. 后背内容
<button type="submit">
<slot>Submit</slot>
</button>
3. 具名插槽
Vue.component('hello',{ template:` <div class="container"> <header> <slot name="header"></slot> <slot name="hhee"></slot> <slot name="header-wrong"></slot> </header> <main> <slot></slot> </main> <footer> <slot name="footer"></slot> </footer> </div> ` }) /* eslint-disable no-new */ new Vue({ el: '#app', // router, // store, // components: { App }, // template: '<App/>' template:` <hello> <template slot="header"> <h1>Here might be a page title</h1> </template> <h2 slot="hhee">hhee</h2> <template v-slot="header-wrong"> <h1>past,wrong way</h1> </template> <p>A paragraph for the main content.</p> <p>And another one.</p> <template slot="footer"> <p>Here's some contact info</p> </template> </hello> ` })
1 替代 template 多条件判断的普通用法
<!DOCTYPE html> <html lang="zh-CN"> <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> </head> <body> <div id="app"> <my-component :list="list"></my-component> </div> <script src="vue.js"></script> <script> Vue.component('my-component', { props: { list: { type: Array, default: () => [] } }, render(createElement) { if (this.list.length) { return createElement('ul', this.list.map(item => createElement('li', item))) } else { return createElement('p', 'Empty list') } } }) new Vue({ el: '#app', data: { list: ['html', 'css', 'javascript'] } }) </script> </body> </html>
2 自定义指令、多组元素
Vue.component('my-component', { data() { return { message: '' } }, render(createElement) { return createElement( 'div', [ createElement( 'input', { on: { input: e => this.message = e.target.value } } ), createElement('p', this.message) ] ) } })