美文网首页
🎩 vue核心原理---vue三要素之模板引擎 👩‍👧 👨‍👧

🎩 vue核心原理---vue三要素之模板引擎 👩‍👧 👨‍👧

作者: nico1988 | 来源:发表于2018-09-15 02:47 被阅读0次

    vue三要素

    • 响应式:vue 如何监听到 data 的每个属性变化?
    • 模板引擎:vue 的模板如何被解析,指令如何处理?

    • 渲染:vue 的模板如何被渲染成 html ?以及渲染过程

    模板是什么

    • 本质
      vue中,template中的代码,字符串
    • 有逻辑处理 有v-if v-for等,
      很多后才程序有模板,之前的web开发模板都在后台处理
    • 和html很像
      但是浏览器压根不认识,根本不是html,最终要转化成html的样子
    • 模板必须转为js代码
      有逻辑处理,html js css只有js能够处理逻辑
      同时将模板转化成字符串渲染html成为页面,必须要js才能实现
    • js的渲染函数 -- render函数

    说一说with vue中有用到(大佬们都说,开发中尽量不要用with)

    为什么要用with 以为可以使得代码更加简洁,不用写外面的对象


    with .png

    vue render 函数

    模板字符串会被转化成右边的with函数
    模板中所有的信息包含在render函数中,this就是vm实例,vnode


    image.png

    vue 中render函数源码

    搜索coder.render


    image.png image.png

    大致逻辑 模板-render函数

    对应图


    image.png

    工具化的细节,只要知道大概逻辑即可
    template模板-html parser处理 - 抽象语法数--生成函数体字符串-通过new Function生成函数
    vue 2.0 开始支持预编译
    我们要知道的,模板和render函数的对应关系是怎么样的,具体模板怎么变成render函数的,会用工具就ok

    双向数据绑定的原理

    注意,双向数据绑定和响应式的区别

    • 输出:input输入触发render函数input事件,改变vm实例的title
    • 赋值:title属性改变,,通过directives或者domprops把改动相应到input中
      data中的属性methods中的方法都会绑定到对应的vm实例上面
    <div id="app">
            <div>
                <input v-model="title">
                <button v-on:click="add">submit</button>
            </div>
            <div>
                <ul>
                    <li v-for="item in list">{{item}}</li>
                </ul>
            </div>
        </div>
    
        <script type="text/javascript">
            // data 独立
            var data = {
                title: '',
                list: []
            }
            
            // 初始化 Vue 实例
            var vm = new Vue({
                el: '#app',
                data: data,
                methods: {
                    add: function () {
                        this.list.push(this.title)
                        this.title = ''
                    }
                }
            })
    
    with(this) {
      return _c('div', {
        attrs: {
          "id": "app"
        }
      }, [_c('div', [_c('input', {
        directives: [{
          name: "model",
          rawName: "v-model",
          value: (title),
          expression: "title"
        }],
        domProps: {
          "value": (title)
        },
        on: {
          "input": function($event) {
            if ($event.target.composing) return;
            title = $event.target.value
          }
        }
      }), _v(" "), _c('button', {
        on: {
          "click": add
        }
      }, [_v("submit")])]), _v(" "), _c('div', [_c('ul', _l((list), function(item) { // _l是一个数组 (list)对list进行了遍历
        return _c('li', [_v(_s(item))])
      }))])])
    }
    

    v-for

    根据上面的代码,其实v-for在render函数中返回的 就是一个函数

    _l((list), function(item) { // _l是一个数组 (list)对list进行了遍历
        return _c('li', [_v(_s(item))])
      }))])
    
    image.png

    v-if

    其实就是一个判断


                                    🤠你的鼓励对我很重要,会激励我写出更加优秀的文章🤠
    
    鼓励.png

    相关文章

      网友评论

          本文标题:🎩 vue核心原理---vue三要素之模板引擎 👩‍👧 👨‍👧

          本文链接:https://www.haomeiwen.com/subject/klczgftx.html