<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Vuerender從零開始使用

        來源:懂視網 責編:小采 時間:2020-11-27 19:39:32
        文檔

        Vuerender從零開始使用

        Vuerender從零開始使用:這次給大家帶來Vue render從零開始使用,Vue render從零開始使用的注意事項有哪些,下面就是實戰案例,一起來看一下。簡介在使用Vue進行開發的時候,大多數情況下都是使用template進行開發,使用template簡單、方便、快捷,可是有時候需要特殊的場景使用te
        推薦度:
        導讀Vuerender從零開始使用:這次給大家帶來Vue render從零開始使用,Vue render從零開始使用的注意事項有哪些,下面就是實戰案例,一起來看一下。簡介在使用Vue進行開發的時候,大多數情況下都是使用template進行開發,使用template簡單、方便、快捷,可是有時候需要特殊的場景使用te

        這次給大家帶來Vue render從零開始使用,Vue render從零開始使用的注意事項有哪些,下面就是實戰案例,一起來看一下。

        簡介

        在使用Vue進行開發的時候,大多數情況下都是使用template進行開發,使用template簡單、方便、快捷,可是有時候需要特殊的場景使用template就不是很適合。因此為了很好使用render函數,我決定深入窺探一下。各位看官如果覺得下面寫的有不正確之處還望看官指出,你們與我的互動就是寫作的最大動力。

        場景

        官網描述的場景當我們開始寫一個通過 level prop 動態生成 heading 標簽的組件,你可能很快想到這樣實現:

        <script type="text/x-template" id="anchored-heading-template">
         <h1 v-if="level === 1">
         <slot></slot>
         </h1>
         <h2 v-else-if="level === 2">
         <slot></slot>
         </h2>
         <h3 v-else-if="level === 3">
         <slot></slot>
         </h3>
         <h4 v-else-if="level === 4">
         <slot></slot>
         </h4>
         <h5 v-else-if="level === 5">
         <slot></slot>
         </h5>
         <h6 v-else-if="level === 6">
         <slot></slot>
         </h6>
        </script>
        Vue.component('anchored-heading', {
         template: '#anchored-heading-template',
         props: {
         level: {
         type: Number,
         required: true
         }
         }
        })

        在這種場景中使用 template 并不是最好的選擇:首先代碼冗長,為了在不同級別的標題中插入錨點元素,我們需要重復地使用 <slot></slot>。

        雖然模板在大多數組件中都非常好用,但是在這里它就不是很簡潔的了。那么,我們來嘗試使用 render 函數重寫上面的例子:

        Vue.component('anchored-heading', {
         render: function (createElement) {
         return createElement(
         'h' + this.level, // tag name 標簽名稱
         this.$slots.default // 子組件中的陣列
         )
         },
         props: {
         level: {
         type: Number,
         required: true
         }
         }
        })

        簡單清晰很多!簡單來說,這樣代碼精簡很多,但是需要非常熟悉 Vue 的實例屬性。在這個例子中,你需要知道當你不使用 slot 屬性向組件中傳遞內容時,比如 anchored-heading 中的 Hello world!,這些子元素被存儲在組件實例中的 $slots.default中。

        createElement參數介紹

        接下來你需要熟悉的是如何在 createElement 函數中生成模板。這里是 createElement 接受的參數:

        createElement(
         // {String | Object | Function}
         // 一個 HTML 標簽字符串,組件選項對象,或者
         // 解析上述任何一種的一個 async 異步函數,必要參數。
         'p',
         // {Object}
         // 一個包含模板相關屬性的數據對象
         // 這樣,您可以在 template 中使用這些屬性。可選參數。
         {
         // (詳情見下一節)
         },
         // {String | Array}
         // 子節點 (VNodes),由 `createElement()` 構建而成,
         // 或使用字符串來生成“文本節點”。可選參數。
         [
         '先寫一些文字',
         createElement('h1', '一則頭條'),
         createElement(MyComponent, {
         props: {
         someProp: 'foobar'
         }
         })
         ]
        )

        深入 data 對象

        有一件事要注意:正如在模板語法中,v-bind:class 和 v-bind:style ,會被特別對待一樣,在 VNode 數據對象中,下列屬性名是級別最高的字段。該對象也允許你綁定普通的 HTML 特性,就像 DOM 屬性一樣,比如 innerHTML (這會取代 v-html 指令)。

        {
         // 和`v-bind:class`一樣的 API
         'class': {
         foo: true,
         bar: false
         },
         // 和`v-bind:style`一樣的 API
         style: {
         color: 'red',
         fontSize: '14px'
         },
         // 正常的 HTML 特性
         attrs: {
         id: 'foo'
         },
         // 組件 props
         props: {
         myProp: 'bar'
         },
         // DOM 屬性
         domProps: {
         innerHTML: 'baz'
         },
         // 事件監聽器基于 `on`
         // 所以不再支持如 `v-on:keyup.enter` 修飾器
         // 需要手動匹配 keyCode。
         on: {
         click: this.clickHandler
         },
         // 僅對于組件,用于監聽原生事件,而不是組件內部使用
         // `vm.$emit` 觸發的事件。
         nativeOn: {
         click: this.nativeClickHandler
         },
         // 自定義指令。注意,你無法對 `binding` 中的 `oldValue`
         // 賦值,因為 Vue 已經自動為你進行了同步。
         directives: [
         {
         name: 'my-custom-directive',
         value: '2',
         expression: '1 + 1',
         arg: 'foo',
         modifiers: {
         bar: true
         }
         }
         ],
         // Scoped slots in the form of
         // { name: props => VNode | Array<VNode> }
         scopedSlots: {
         default: props => createElement('span', props.text)
         },
         // 如果組件是其他組件的子組件,需為插槽指定名稱
         slot: 'name-of-slot',
         // 其他特殊頂層屬性
         key: 'myKey',
         ref: 'myRef'
        }

        條件渲染

        既然熟讀以上api接下來咱們就來點實戰。

        之前這樣寫

        //HTML
        <p id="app">
         <p v-if="isShow">我被你發現啦!!!</p>
        </p>
        <vv-isshow :show="isShow"></vv-isshow>
        //js
        //組件形式 
        Vue.component('vv-isshow', {
         props:['show'],
         template:'<p v-if="show">我被你發現啦2!!!</p>',
        });
        var vm = new Vue({
         el: "#app",
         data: {
         isShow:true
         }
        });

        render這樣寫

        //HTML
        <p id="app">
         <vv-isshow :show="isShow"><slot>我被你發現啦3!!!</slot></vv-isshow>
        </p>
        //js
        //組件形式 
        Vue.component('vv-isshow', {
         props:{
         show:{
         type: Boolean,
         default: true
         }
         },
         render:function(h){ 
         if(this.show ) return h('p',this.$slots.default);
         },
        });
        var vm = new Vue({
         el: "#app",
         data: {
         isShow:true
         }
        });

        列表渲染

        之前是這樣寫的,而且v-for 時template內必須被一個標簽包裹

        //HTML
        <p id="app">
         <vv-aside v-bind:list="list"></vv-aside>
        </p>
        //js
        //組件形式 
        Vue.component('vv-aside', {
         props:['list'],
         methods:{
         handelClick(item){
         console.log(item);
         }
         },
         template:'<p>\
         <p v-for="item in list" @click="handelClick(item)" :class="{odd:item.odd}">{{item.txt}}</p>\
         </p>',
         //template:'<p v-for="item in list" @click="handelClick(item)" :class="{odd:item.odd}">{{item.txt}}</p>',錯誤 
        });
        var vm = new Vue({
         el: "#app",
         data: {
         list: [{
         id: 1,
         txt: 'javaScript',
         odd: true
         }, {
         id: 2,
         txt: 'Vue',
         odd: false
         }, {
         id: 3,
         txt: 'React',
         odd: true
         }]
         }
        });

        render這樣寫

        //HTML
        <p id="app">
         <vv-aside v-bind:list="list"></vv-aside>
        </p>
        //js
        //側邊欄
        Vue.component('vv-aside', {
         render: function(h) {
         var _this = this,
         ayy = this.list.map((v) => {
         return h('p', {
         'class': {
         odd: v.odd
         },
         attrs: {
         title: v.txt
         },
         on: {
         click: function() {
         return _this.handelClick(v);
         }
         }
         }, v.txt);
         });
         return h('p', ayy);
         },
         props: {
         list: {
         type: Array,
         default: () => {
         return this.list || [];
         }
         }
         },
         methods: {
         handelClick: function(item) {
         console.log(item, "item");
         }
         }
        });
        var vm = new Vue({
         el: "#app",
         data: {
         list: [{
         id: 1,
         txt: 'javaScript',
         odd: true
         }, {
         id: 2,
         txt: 'Vue',
         odd: false
         }, {
         id: 3,
         txt: 'React',
         odd: true
         }]
         }
        });

        v-model

        之前的寫法

        //HTML
        <p id="app">
         <vv-models v-model="txt" :txt="txt"></vv-models>
        </p>
        //js
        //input
        Vue.component('vv-models', {
         props: ['txt'],
         template: '<p>\
         <p>看官你輸入的是:{{txtcout}}</p>\
         <input v-model="txtcout" type="text" />\
         </p>',
         computed: {
         txtcout:{
         get(){
         return this.txt;
         },
         set(val){
         this.$emit('input', val);
         }
         
         }
         }
        });
        var vm = new Vue({
         el: "#app",
         data: {
         txt: '', 
         }
        });

        render這樣寫

        //HTML
        <p id="app">
         <vv-models v-model="txt" :txt="txt"></vv-models>
        </p>
        //js
        //input
        Vue.component('vv-models', {
         props: {
         txt: {
         type: String,
         default: ''
         }
         },
         render: function(h) {
         var self=this;
         return h('p',[h('p','你猜我輸入的是啥:'+this.txt),h('input',{
         on:{
         input(event){
         self.$emit('input', event.target.value);
         }
         }
         })] );
         },
        });
        var vm = new Vue({
         el: "#app",
         data: {
         txt: '', 
         }
        });

        總結

        render函數使用的是JavaScript 的完全編程的能力,在性能上是占用絕對的優勢,小編只是對它進行剖析。至于實際項目你選擇那種方式進行渲染依舊需要根據你的項目以及實際情況而定。

        相信看了本文案例你已經掌握了方法,更多精彩請關注Gxl網其它相關文章!

        推薦閱讀:

        json-server怎樣做出后端數據

        vuex狀態管理使用詳解

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Vuerender從零開始使用

        Vuerender從零開始使用:這次給大家帶來Vue render從零開始使用,Vue render從零開始使用的注意事項有哪些,下面就是實戰案例,一起來看一下。簡介在使用Vue進行開發的時候,大多數情況下都是使用template進行開發,使用template簡單、方便、快捷,可是有時候需要特殊的場景使用te
        推薦度:
        標簽: 使用 VUE 使用vue
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲av午夜福利精品一区 | 国产精品永久免费视频| 亚洲熟女乱色一区二区三区| 深夜免费在线视频| 91久久成人免费| 亚洲真人日本在线| 亚洲av无码一区二区三区天堂古代 | a级毛片免费全部播放| 2021免费日韩视频网| 亚洲精品456播放| 亚洲人成77777在线观看网| 黄色一级免费网站| 丁香花免费高清视频完整版| 亚洲第一AV网站| 亚洲精品国产首次亮相| **aaaaa毛片免费同男同女| 日韩精品亚洲aⅴ在线影院| 亚洲人成人网毛片在线播放| 韩国18福利视频免费观看| 亚洲毛片无码专区亚洲乱| aa级女人大片喷水视频免费| 亚洲精品卡2卡3卡4卡5卡区| 美女羞羞喷液视频免费| 国产亚洲精久久久久久无码77777| 丝瓜app免费下载网址进入ios| 亚洲欧洲国产综合AV无码久久| 久久精品无码免费不卡| 久久精品国产亚洲AV麻豆网站| 久久精品成人免费网站| 国产亚洲精品成人a v小说| 一级看片免费视频囗交| 国产99视频免费精品是看6| 亚洲色大成网站www尤物| 亚洲日韩在线观看| 亚洲香蕉免费有线视频| 羞羞视频免费网站含羞草| 亚洲人成亚洲精品| xxxx日本免费| 特级av毛片免费观看| 亚洲码一区二区三区| 久久国产成人亚洲精品影院|