温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么使用Vue中的render函数

发布时间:2021-02-20 16:28:52 来源:亿速云 阅读:226 作者:小新 栏目:web开发

小编给大家分享一下怎么使用Vue中的render函数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

第一个参数(必须) - {String | Object | Function}

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title>render</title>   <script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script> </head> <body>   <div id="app">     <elem></elem>   </div>   <script>     Vue.component('elem', {       render: function(createElement) {         return createElement('div');//一个HTML标签字符         /*return createElement({           template: '<div></div>'//组件选项对象         });*/         /*var func = function() {           return {template: '<div></div>'}         };         return createElement(func());//一个返回HTML标签字符或组件选项对象的函数*/       }     });     new Vue({       el: '#app'     });   </script> </body> </html>

第二个参数(可选) - {Object}

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title>render</title>   <script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script> </head> <body>   <div id="app">     <elem></elem>   </div>   <script>     Vue.component('elem', {       render: function(createElement) {         var self = this;         return createElement('div', {//一个包含模板相关属性的数据对象           'class': {             foo: true,             bar: false           },           style: {             color: 'red',             fontSize: '14px'           },           attrs: {             id: 'foo'           },           domProps: {             innerHTML: 'baz'           }         });       }     });     new Vue({       el: '#app'     });   </script> </body> </html>

第三个参数(可选) - {String | Array}

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title>render</title>   <script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script> </head> <body>   <div id="app">     <elem></elem>   </div>   <script>     Vue.component('elem', {       render: function(createElement) {         var self = this;         // return createElement('div', '文本');//使用字符串生成文本节点         return createElement('div', [//由createElement函数构建而成的数组           createElement('h2', '主标'),//createElement函数返回VNode对象           createElement('h3', '副标')         ]);       }     });     new Vue({       el: '#app'     });   </script> </body> </html>

两种组件写法对比

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title>render</title>   <script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script> </head> <body>   <div id="app">     <ele></ele>   </div>   <script>     /*Vue.component('ele', {       template: '<div id="elem" :class="{show: show}" @click="handleClick">文本</div>',       data: function() {         return {           show: true         }       },       methods: {         handleClick: function() {           console.log('clicked!');         }       }     });*/     Vue.component('ele', {       render: function(createElement) {         return createElement('div', {           'class': {             show: this.show           },           attrs: {             id: 'elem'           },           on: {             click: this.handleClick           }         }, '文本');       },       data: function() {         return {           show: true         }       },       methods: {         handleClick: function() {           console.log('clicked!');         }       }     });     new Vue({       el: '#app'     });   </script> </body> </html>

this.$slots用法

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title>render</title>   <script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script> </head> <body>   <div id="app">     <blog-post>       <h2 slot="header"><span>About Me</span></h2>       <p>Here's some page content</p>       <p slot="footer">Copyright 2016 Evan You</p>       <p>If I have some content down here</p>     </blog-post>   </div>   <script>     Vue.component('blog-post', {       render: function(createElement) {         var header = this.$slots.header,//返回由VNode组成的数组           body = this.$slots.default,           footer = this.$slots.footer;         return createElement('div', [           createElement('header', header),           createElement('main', body),           createElement('footer', footer)         ])       }     });     new Vue({       el: '#app'     });   </script> </body> </html>

使用props传递数据

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title>render</title>   <script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script> </head> <body>   <div id="app">     <ele :show="show"></ele>     <ele :show="!show"></ele>   </div>   <script>     Vue.component('ele', {       render: function(createElement) {         if (this.show) {           return createElement('p', 'true');         } else {           return createElement('p', 'false');         }       },       props: {         show: {           type: Boolean,           default: false         }       }     });     new Vue({       el: '#app',       data: {         show: false       }     });   </script> </body> </html>

VNodes必须唯一

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title>render</title>   <script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script> </head> <body>   <!-- VNode必须唯一 -->   <div id="app">     <ele></ele>   </div>   <script>     var child = {       render: function(createElement) {         return createElement('p', 'text');       }     };     /*Vue.component('ele', {       render: function(createElement) {         var childNode = createElement(child);         return createElement('div', [           childNode, childNode//VNodes必须唯一,渲染失败         ]);       }     });*/     Vue.component('ele', {       render: function(createElement) {         return createElement('div',            Array.apply(null, {             length: 2           }).map(function() {             return createElement(child)//正确写法           })         );       }     });     new Vue({       el: '#app'     })   </script> </body> </html>

v-model指令

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title>render</title>   <script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script> </head> <body>   <div id="app">     <el-input :name="name" @input="val=>name=val"></el-input>     <div>你的名字是{{name}}</div>   </div>   <script>     Vue.component('el-input', {       render: function(createElement) {         var self = this;         return createElement('input', {           domProps: {             value: self.name           },           on: {             input: function(event) {               self.$emit('input', event.target.value);             }           }         })       },       props: {         name: String       }     });     new Vue({       el: '#app',       data: {         name: 'hdl'       }     });   </script> </body> </html>

作用域插槽

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title>render</title>   <script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script> </head> <body>   <div id="app">     <ele>       <template scope="props">         <span>{{props.text}}</span>       </template>     </ele>   </div>   <script>     Vue.component('ele', {       render: function(createElement) {         // 相当于<div><slot :text="msg"></slot></div>         return createElement('div', [           this.$scopedSlots.default({             text: this.msg           })         ]);       },       data: function() {         return {           msg: '来自子组件'         }       }     });     new Vue({       el: '#app'     });   </script> </body> </html>

向子组件中传递作用域插槽

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title>render</title>   <script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script> </head> <body>   <div id="app">     <ele></ele>   </div>   <script>     Vue.component('ele', {       render: function(createElement) {         return createElement('div', [           createElement('child', {             scopedSlots: {               default: function(props) {                 return [                   createElement('span', '来自父组件'),                   createElement('span', props.text)                 ];               }             }           })         ]);       }     });     Vue.component('child', {       render: function(createElement) {         return createElement('b', this.$scopedSlots.default({text: '我是组件'}));       }     });     new Vue({       el: '#app'     });   </script> </body> </html>

函数化组件

<!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <title>render</title>   <script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script> </head> <body>   <div id="app">     <smart-item :data="data"></smart-item>     <button @click="change('img')">切换为图片为组件</button>     <button @click="change('video')">切换为视频为组件</button>     <button @click="change('text')">切换为文本组件</button>   </div>   <script>     // 图片组件选项     var ImgItem = {       props: ['data'],       render: function(createElement) {         return createElement('div', [           createElement('p', '图片组件'),           createElement('img', {             attrs: {               src: this.data.url             }           })         ]);       }     }     // 视频组件     var VideoItem = {       props: ['data'],       render: function(createElement) {         return createElement('div', [           createElement('p', '视频组件'),           createElement('video', {             attrs: {               src: this.data.url,               controls: 'controls',               autoplay: 'autoplay'             }           })         ]);       }     };     /*纯文本组件*/     var TextItem = {       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) {         function getComponent() {           var data = context.props.data;           if (data.type === 'img') return ImgItem;           if (data.type === 'video') return VideoItem;           return TextItem;         }         return createElement(           getComponent(),           {             props: {               data: context.props.data             }           },           context.children         )       },       props: {         data: {           type: Object,           required: true         }       }     });     new Vue({       el: '#app',       data() {         return {           data: {}         }       },       methods: {         change: function(type) {            if (type === 'img') {             this.data = {               type: 'img',               url: 'https://cache.yisu.com/upload/information/20200622/114/66772.png'             }           } else if (type === 'video') {             this.data = {               type: 'video',               url: 'http://vjs.zencdn.net/v/oceans.mp4'             }           } else if (type === 'text') {             this.data = {               type: 'text',               content: '这是一段纯文本'             }           }         }       },       created: function() {         this.change('img');       }     });   </script> </body> </html>

以上是“怎么使用Vue中的render函数”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI