Custom Renderer自定義渲染器


在vue3.0中,為了更好的實現多平台應用,將渲染器的創建函數createRenderer方法單獨分離出來,這個API可以用來自定義渲染邏輯,將Virtual DOM渲染為web平台真實DOM

作用:實現脫離於源碼之外的各種跨平台操作

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="app"></div>
    <script>
        console.log(Vue)
    </script>
</body>
</html>

 我們可以看到控制台輸出

 

 

 Vue是一個對象,暴露了很多的api

<body>
    <div id="app">
        {{count}}
    </div>
    <script>
        // console.log(Vue)
        let {createApp} =Vue;
        //創建app的實例
        createApp({
            data(){
                return {
                    count:2
                }
            }
        }).mount("#app")   //掛載到#app上
    </script>
</body>

 此時我們打開瀏覽器就可以看到

 

 

 我們也可以渲染組件

<body>
    <div id="app">
        {{count}}
        <fun></fun>  //調用組件並渲染
    </div>
    <script>
        // console.log(Vue)
        let {createApp} =Vue;
        //創建app的實例
        createApp({
            data(){
                return {
                    count:2
                }
            }
        }).component('fun',{   //創建一個組件
            template:"<div>fun</div>" }).mount("#app")
    </script>
</body>

 

 

 手寫簡單的vue初始化操作

1>掛載根組件

//創建app的實例   接收的是根組件的配置
        Vue.createApp({
            data(){
                return {
                    count:2
                }
            }
        }).mount("#app")

2>創建一個Vue

    // 創建Vue
     let Vue={
            // Vue這個對象提供一個createApp的方法,接收一個初始化的選項
         createApp(options){
                // 真正用來創建app的是renderer渲染器
                return renderer.createApp(options)
         }
     }

 3>創建renderer

 //創建一個renderer的實例來自一個工廠函數createRenderer  參數是dom操作
        let renderer=createRenderer({
            createElement(tag){
                return document.createElement(tag)
            },
            insert(child,parent){
                parent.appendChild(child)
            }
        })

 4>創建createRenderer 工廠函數

let createRenderer=({createElement,insert})=>{
            // 把vnode渲染為真是的dom
            let render=(vnode,container)=>{
                //返回真正的渲染器
                //解析vnode變成真是的dom
                let child=createElement(vnode.tag)
                if(typeof vnode.children==='string'){
                    child.textContent=vnode.children;
                }
                //省略了多個子元素的情況
                //追加節點
                insert(child,container)
            }
            //   返回真正的渲染器
            return {
                render,
                createApp:createAppAPI(render)
            }
        }

 5>創建真正的createApp方法的createAppAPI

let createAppAPI=(render)=>{
            //返回一個真正的createApp函數
            return function createApp(rootComponent){
                //核心創建app實例
                //app實例需要定義mount方法    use  component方法等方法
                let app={
                    //rootcontainer是一個宿主元素
                    mount(rootcontainer){
                        //調用傳進來的render函數
                        //手動創建一個虛擬dom
                        let vnode ={
                            tag:'h3',
                            props:null,
                            children:rootComponent.data().count+''
                        }
                        render(vnode,document.querySelector(rootcontainer))
                    }
                }
                return app
            }
        }

此時節點就以<h3>渲染

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM