溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

vue框架render方法怎么替換template

發(fā)布時間:2022-04-12 13:57:00 來源:億速云 閱讀:319 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“vue框架render方法怎么替換template”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

    render方法替換template

    使用template屬性創(chuàng)建組件模板

    import Vue from 'vue'
     
    const Item = Vue.component('Item', {
      template: `<div>
                    <h3>子組件</h3>
                    <slot></slot>
                  </div>`
    })
    const app = new Vue({
      el: '#app',
      template: `<div ref="myDiv">              <item ref="item">
                    <p ref="p">this is a slot</p>
                  </item>
                </div>`,
     data: {
        count: 0  },
      components: {
        Item
      }
    })

    把父組件的template創(chuàng)建換成使用render方法創(chuàng)建

    const app = new Vue({
      el: '#app',
      data: {
        count: 0
      },
      render (createElement) {
        return createElement(
          'div', {
            ref: 'myDiv',
            // domProps: {
            //    innerHTML: '<span>注意:添加該屬性會把后面的子節(jié)點覆蓋</span>'
            // },
            attrs: {
                id: 'test-id',
                title: 'test-title'  
            }
          },
          [
            createElement('item', {
              ref: 'item'
            },
            [
              createElement('p', {
                ref: 'p'
              }, 'this is a slot')
            ])
          ])
      },
      components: {
        Item
      }
    })

    1.如上面更改后的代碼,render方法內(nèi)傳入createElement函數(shù),接下來使用createElement函數(shù)來創(chuàng)建節(jié)點。

    2.函數(shù)方法格式 createElement('節(jié)點或組件名稱', {節(jié)點屬性}, [子節(jié)點])

    3.先創(chuàng)建一個div元素, 內(nèi)部包含ref='myDiv'的屬性, 使用數(shù)組存放其子節(jié)點

    4.數(shù)組內(nèi)子節(jié)點是 item組件, 屬性是 ref="item", 其子節(jié)點為p, 依次類推逐層創(chuàng)建子節(jié)點, 最后的文本節(jié)點使用字符串或變量即可,無需再用[]包含。

    template和render用法對比

    App.vue(主入口文件)

    <template>
        <ParentCmp />
    </template>
    <script>
    import ParentCmp from './ParentCmp';
    export default {
        components: {
            ParentCmp
        },
    }
    </script>

    vue框架render方法怎么替換template

    ParentCmp.vue (template寫法)

    <template>
        <div>
            <h2>我是parent組件</h2>
            <hr />
            <User  text="我是傳入的文本">
                <template v-slot:header>
                    <p>這是名字為header的slot</p>
                </template>
                <p>這是填充默認slot數(shù)據(jù)</p>
                <template v-slot:footer>
                    <p>這是名字為footer的slot</p>
                </template>
                <template v-slot:item="props">
                    <p>名字為item的作用域插槽。顯示數(shù)據(jù){{props}}</p>
                </template>
                <template v-slot:list="props">
                    <p>名字為list的作用域插槽。顯示數(shù)據(jù){{props}}</p>
                </template>
            </User>
        </div>
    </template>
    <script>
    import User from './User'
    export default {
        components: {
            User
        },
        props: {},
        data() {
            return {}
        },
        methods: {}
    }
    </script>

    User.vue (template寫法)

    <template>
        <div>
            <h5>{{text}}</h5>
            <slot name="header"></slot>
            <slot>默認的user slot</slot>
            <slot name="footer"></slot>
            <slot name="item" v-bind="item">item作用域插槽,展示姓名 {{item.name}}</slot>
            <slot name="list" v-bind="{list}">list作用域插槽</slot>
        </div>
    </template>
    <script>
    export default {
        props: {
            text: String
        },
        data() {
            return {
                item: {
                    name: '張三',
                    age: 28,
                    works: '前端、后端、設(shè)計、產(chǎn)品'
                },
                list: ['a','b','c']
            }
        }
    }
    </script>

    ParentCmp.js (render寫法)

    import User from './User'
    export default {
        props: {},
        data() {
            return {}
        },
        methods: {},
        render(h) {
            return h('div',[
                h('h2', '我是parent組件'),
                h('hr'),
                h(User, {
                    props: {
                        text: '我是傳入的文本'
                    },
                    style: {
                        background: '#ccc'
                    },
                    // 作用域插槽寫在scopedSlots里
                    scopedSlots: {
                        item: props => h('p', `名字為item的作用域插槽。顯示數(shù)據(jù)${JSON.stringify(props)}`),
                        list: props => h('p', `名字為list的作用域插槽。顯示數(shù)據(jù)${JSON.stringify(props)}`)
                    }
                }, 
                // 非作用域插槽寫數(shù)組里
                [
                    h('p', {slot: 'header'}, '這是名字為header的slot'),
                    h('p', '這是填充默認slot數(shù)據(jù)'),
                    h('p', {slot: 'footer'}, '這是名字為footer的slot'),
                ])
            ]);
            // jxs寫法
            /* return (
                <div>
                    <h2>我是parent組件</h2>
                    <hr />
                    <User 
                         
                        text="我是傳入的文本" 
                        scopedSlots={
                            {
                                item: props => (<p>名字為item的作用域插槽。顯示數(shù)據(jù){JSON.stringify(props)}</p>),
                                list: props => (<p>名字為list的作用域插槽。顯示數(shù)據(jù){JSON.stringify(props)}</p>),
                            }
                        }
                    >
                        <p slot="header">這是名字為header的slot</p>
                        <p>這是填充默認slot數(shù)據(jù)</p>
                        <p slot="footer">這是名字為footer的slot</p>
                    </User>
                </div>
            ); */
        }
    }

    User.js (render寫法)

    export default {
        props: {
            text: String
        },
        data () {
            return {
                item: {
                    name: '張三',
                    age: 28,
                    works: '前端、后端、設(shè)計、產(chǎn)品'
                },
                list: ['a', 'b', 'c']
            }
        },
        methods: {
            getSlot (name, data) {
                if (this.$scopedSlots[name]) {
                    return this.$scopedSlots[name](data);
                } else if (this.$slots[name]) {
                    return this.$slots[name];
                }
        
                return undefined;
            },
        },
        render (h) {
            return h('div', [
                h('h5', this.text),
                this.getSlot('header'),
                this.$slots.default,
                this.getSlot('footer'),
                this.getSlot('item', this.item),
                this.getSlot('list', {list: this.list}),
            ])
            // jxs寫法
            /* return (
                <div>
                    <h5>{this.text}</h5>
                    {this.getSlot('header')}
                    {this.$slots.default}
                    {this.getSlot('footer')}
                    {this.getSlot('item', this.item)}
                    {this.getSlot('list', {list: this.list})}
                </div>
            ); */
        }
    }

    “vue框架render方法怎么替換template”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

    向AI問一下細節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI