如何理解Vue的render函數(shù)的具體用法
本文介紹了如何理解Vue的render函數(shù)的具體用法,分享給大家,具體如下:
第一個(gè)參數(shù)(必須) - {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');//一個(gè)HTML標(biāo)簽字符 /*return createElement({ template: '<div></div>'//組件選項(xiàng)對(duì)象 });*/ /*var func = function() { return {template: '<div></div>'} }; return createElement(func());//一個(gè)返回HTML標(biāo)簽字符或組件選項(xiàng)對(duì)象的函數(shù)*/ } }); new Vue({ el: '#app' }); </script> </body> </html>
第二個(gè)參數(shù)(可選) - {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', {//一個(gè)包含模板相關(guān)屬性的數(shù)據(jù)對(duì)象 'class': { foo: true, bar: false }, style: { color: 'red', fontSize: '14px' }, attrs: { id: 'foo' }, domProps: { innerHTML: 'baz' } }); } }); new Vue({ el: '#app' }); </script> </body> </html>
第三個(gè)參數(shù)(可選) - {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', '文本');//使用字符串生成文本節(jié)點(diǎn) return createElement('div', [//由createElement函數(shù)構(gòu)建而成的數(shù)組 createElement('h1', '主標(biāo)'),//createElement函數(shù)返回VNode對(duì)象 createElement('h2', '副標(biāo)') ]); } }); new Vue({ el: '#app' }); </script> </body> </html>
兩種組件寫法對(duì)比
<!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> <h1 slot="header"><span>About Me</span></h1> <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組成的數(shù)組 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傳遞數(shù)據(jù)
<!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) { // 相當(dāng)于<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>
函數(shù)化組件
<!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> // 圖片組件選項(xiàng) 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://raw.githubusercontent.com/iview/iview/master/assets/logo.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>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue跳轉(zhuǎn)頁面的幾種常用方法實(shí)例總結(jié)
Vue是一種流行的JavaScript框架,用于構(gòu)建用戶界面,在Vue中,頁面跳轉(zhuǎn)通常使用路由(Router)來實(shí)現(xiàn),除此之外還有很多方法,這篇文章主要給大家介紹了關(guān)于vue跳轉(zhuǎn)頁面的幾種常用方法,需要的朋友可以參考下2024-05-05vue3項(xiàng)目如何使用prettier格式化代碼
這篇文章主要介紹了vue3項(xiàng)目如何使用prettier格式化代碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10Vue商品控件與購(gòu)物車聯(lián)動(dòng)效果的實(shí)例代碼
這篇文章主要介紹了Vue商品控件與購(gòu)物車聯(lián)動(dòng)效果的實(shí)例代碼,代碼簡(jiǎn)單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07vuejs開發(fā)組件分享之H5圖片上傳、壓縮及拍照旋轉(zhuǎn)的問題處理
這篇文章主要介紹了vuejs開發(fā)組件分享之H5圖片上傳、壓縮及拍照旋轉(zhuǎn)的問題處理,需要的朋友可以參考下2017-03-03Vue實(shí)現(xiàn)Base64轉(zhuǎn)png、jpg圖片格式
這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)Base64轉(zhuǎn)png、jpg圖片格式的相關(guān)資料,前段獲取生成的是base64圖片,需要轉(zhuǎn)化為jpg,png,需要的朋友可以參考下2023-09-09Vue.js實(shí)現(xiàn)文件上傳壓縮優(yōu)化處理技巧
這篇文章主要介紹了Vue.js實(shí)現(xiàn)文件上傳壓縮優(yōu)化處理,本文給大家介紹兩種方法一種是借助canvas的封裝的文件壓縮上傳,二是使用compressorjs第三方插件實(shí)現(xiàn),本文給大家介紹的非常詳細(xì)需要的朋友可以參考下2022-11-11vue單頁面SEO優(yōu)化的實(shí)現(xiàn)
本文主要介紹了vue單頁面SEO優(yōu)化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06