后端必备vue知识第二篇

106 阅读1分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。

一、el与data的两种写法

el有2种写法:

  1. new Vue时候配置el属性
  2. 先创建Vue实例,随后再通过vm.$mount('#root')指定el的值

data有2种写法:

  1. 对象式
  2. 函数式

如何选择:目前哪种写法都可以,以后学习到组件时,data必须使用函数式,否则会报错。

一个重要的原则:

由Vue管理的函数,一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了。

<!-- 准备好一个容器-->
<div id="root">
    <h1>你好,{{name}}</h1>
</div>

<script type="text/javascript">
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

    //el的两种写法
    /* const v = new Vue({
        //el:'#root', //第一种写法
        data:{
                name:'尚硅谷'
        }
    })
    console.log(v)
    v.$mount('#root') //第二种写法 */

    //data的两种写法
    new Vue({
        el:'#root',
        //data的第一种写法:对象式
        /* data:{
                name:'moe'
        } */

        //data的第二种写法:函数式
        data(){
                console.log('@@@',this) //此处的this是Vue实例对象
                return{
                        name:'moe'
                }
        }
    })
</script>

二、MVVM模型

MVVM模型:

  1. M:模型(Model) :data中的数据
  2. V:视图(View) :模板代码
  3. VM:视图模型(ViewModel):Vue实例

观察发现:

  1. data中所有的属性,最后都出现在了vm身上。
  2. vm身上所有的属性 及 Vue原型上所有属性,在Vue模板中都可以直接使用。

三、数据代理

1、回顾Object.defineproperty方法

<script type="text/javascript" >
    let number = 18
    let person = {
        name:'张三',
        sex:'男',
    }

    Object.defineProperty(person,'age',{
        // value:18,
        // enumerable:true, //控制属性是否可以枚举,默认值是false
        // writable:true, //控制属性是否可以被修改,默认值是false
        // configurable:true //控制属性是否可以被删除,默认值是false

        //当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
        get(){
                console.log('有人读取age属性了')
                return number
        },

        //当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
        set(value){
                console.log('有人修改了age属性,且值是',value)
                number = value
        }

    })

    // console.log(Object.keys(person))

    console.log(person)
</script>

2、何为数据代理

<!-- 数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)-->
<script type="text/javascript" >
    let obj = {x:100}
    let obj2 = {y:200}

    Object.defineProperty(obj2,'x',{
            get(){
                    return obj.x
            },
            set(value){
                    obj.x = value
            }
    })
</script>

3、Vue中的数据代理

  1. Vue中的数据代理:通过vm对象来代理data对象中属性的操作(读/写)
  2. Vue中数据代理的好处:更加方便的操作data中的数据
  3. 基本原理:通过Object.defineProperty()把data对象中所有属性添加到vm上。为每一个添加到vm上的属性,都指定一个getter/setter。在getter/setter内部去操作(读/写)data中对应的属性。

四、总结

vue中的数据双向绑定(MVVM),以及数据代理。