vue2 part2

数据代理

通过defineProperty里面传入obj2和x,然后get和set下读取接收下然后再接收set中给对象x用value接收下,这样就能两个数据读取和接收了

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>何为数据代理</title>
</head>

<body>
    <!--数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)-->
    <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>
</body>

</html>

类似指针

控制台输出vm,你的name和address是get和set代理的

 new的vue是一个全局对象,无法在控制台变化,error:data.name失败

vm的data实际存在_data中,但是要额外定义data,导入到new vue中,控制台判断是否===,true

_data相当于另一个新对象,然后里面的值和原始的data数据一样。

控制台vm._data.name='atguigu'
vm.name原来是尚硅谷
vm.name显示"atguigu"

控制台的_data是address,name等是数据劫持

事件处理

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    tle>事件的基本使用</title>
    <!--引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>
    <!--
事件的基本使用:
1.使用v-on:xxx或@xxx绑定事件,其中xxx是事件名;
2.事件的回调需要配置在methods对象中,最终会在vm上;
3.methods中配置的函数,不要用箭头函数!否则this就不是vm了;
4.methods中配置的函数,都是被Vue所管理的函数,this的指向是vm 或组件实例对象
5.@click="demo”和 @click="demo($event)”效果一致,但后者可以传参;
-->
    <!--准备好一个容器-->
    <div id="root">
        <h2>欢迎来到{{name}}学习</h2>
        <!-- <button v-on:click="showInfo">点我提示信息</button> -->
        <button@click="showInfo1">点我提示信息1(不传参)</button>
            <button@click="showInfo2($event,66)">点我提示信息2(传参)</button><!--传参加小括号,同时showInfo失去了event -->
    </div>
</body>
<script type="text/javascript">
    Vue.config.productionTip = false//阻止vue在启动时生成生产提示。


    const vm = new Vue({
        el: '#root',
        data: {
            name: '尚硅谷',
            showInfo2(event, number) {
                console.log(event, number)
                // console.log(event.target.innerText)
                // console.log(this)//此处的this是vm
                alert('同学你好!!')
            }
        },
        methods: {
            showInfo1(event) {
                // console.log(event.target.innerText)
                // console.log(this)//此处的this是vm
                alert('欢迎来到尚硅谷学习!')
            },
            showInfo2(event, number) {
                console.log(event, number)
                // console.log(event.target.innerText)              
                // console.log(this)//此处的this是vm
                alert('同学你好!!')
            }
        }
    })
</script>
</htm1>

太多东西,自己看p14吧

事件修饰符

所以执行顺序是:触发行为->回调->默认行为?

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    tle>事件的基本使用</title>
    <!--引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
    <style>
        * {
            margin-top: 20px;
        }

        .demo1 {
            color: red;
            height: 50px;
        }

        .box1 {
            padding: 50px;
            background-color: skyblue;

        }

        .box2 {
            padding: 20px;
            background-color: pink;
        }
    </style>

</head>

<body>
    <!-- 
    vue的事件修饰符
    1. .prevent 阻止默认事件    
    2. .stop 阻止事件冒泡
    3. .once 只触发一次 
    4. .capture 使用事件的捕获模式
    5. .self 只有event.target是当前操作元素自身时触发事件 
    6. .passive 事件的默认行为立即执行,不会等待事件回调函数执行完毕。
    -->

    <!--准备好一个容器-->
    <div id="root">
        <!-- 阻止默认事件 -->
        <h2>欢迎来到{{name}}学习</h2>
        <a href="https://www.atguigu.com" @click="showInfo">点我提示信息</a>
        <!-- 阻止事件冒泡 -->
        <div class="demo1" @click.stop="showInfo">
            <button @click.stop="showInfo">点我</button>
            <!-- 事件冒泡:即多个组件嵌套,触发内层组件时,会一一触发外层事件 -->
        </div>
        <!-- 事件只触发一次 -->
        <button @click.once="showInfo">点我</button>
        <!-- 使用事件的捕获模式: 捕获是由外往内,冒泡相反-->
        <div class="box1" @click.capture="showMsg(1)">
            div1
            <div class="box2" @click.capture="showMsg(2)">
                div2
            </div>
        </div>

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

    new Vue({
        el: '#root',
        data: {
            name: '尚硅谷'

        },
        methods: {
            showInfo(e) {//这里写showInfo(e) e.preventDefault()阻止默认事件,可以防止页面跳转
                alert('同学你好')
                comsole.log(e.target)
            },

            showMsg(num) {
                console.log('div' + num + '被点击了')
            }
        }
    })
</script>
</htm1>

键盘事件

016_尚硅谷Vue技术_键盘事件_哔哩哔哩_bilibili

总结

修饰符可以连续写,正常逻辑,先写的先运行

@keyup.ctrl.y就可以ctrl+y

姓名案例-差值语法实现

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>姓名案例_插值语法实现</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>
    <!--准备好一个容器-->
    <div id="root">
        姓:<input type="text" v-model="firstName"> <br /><br />
        名:<input type="text" v-model="lastName"><br /><br />
        全名:<span>{{firstName.slice(0,3)}} - {{lastName}}</span><!-- firstname只要3位 -->
        全名:<span>{{fullName()}}</span>
    </div>
</body>

<script type="text/javascript">
    Vue.config.productionTip = false//阻止vue在启动时生成生产提示。
    new Vue({
        el: '#root',
        data: {
            firstName: '张',
            lastName: '三'
        },

        methods: {
            fullName() {
                return this.firstName.slice(0, 3) + '-' + this.lastName //这里的this是vue实例,所以可以直接调用data里面的属性和方法。

            }//数据发生变化,模板重新解析
        },
    })
</script>

</html>

计算属性

计算属性定义:拿着已经写好的属性,用这些属性计算出来一个属性,称为计算属性,data里面放的是属性  ,而计算属性需要放到一个单独的集合体中

019_尚硅谷Vue技术_计算属性_哔哩哔哩_bilibili很好的视频,清清楚楚明明白白

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>姓名案例_插值语法实现</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>
    <!--准备好一个容器-->
    <div id="root">
        姓:<input type="text" v-model="firstName"> <br /><br />
        名:<input type="text" v-model="lastName"><br /><br />
        全名:<span>{{firstName.slice(0,3)}} - {{lastName}}</span><!-- firstname只要3位 -->
        全名:<span>???</span>
    </div>
</body>

<script type="text/javascript">
    Vue.config.productionTip = false//阻止vue在启动时生成生产提示。
    new Vue({
        el: '#root',
        data: {
            firstName: '张',
            lastName: '三'
            x: 'hello'
        },
        //相当于computed中的每个对象默认提供getter和setter,我们只是重写了getter
        computed: {
            fullName: {
                //get有什么作用?当有人读取fullname,get就会被调用,返回值是fullname的值
                //get什么时候被调用?1.当fullname的值被读取时,get就会被调用2.依赖的数据发生变化时,get也会被调用
                get() {//get的this指向vm
                    console.log('get调用了')
                    return this.firstname + '-' + this.lastName
                },//在控制台查找vm._data的firstname,lastname都能找到,但是fullname是underfined,compute已经给了vm
                set(value) {
                    console.log('set', value)
                    const arr = value.split('-')
                    this.firstName = arr[0]
                    this.lastName = arr[1]
                }
            }

        },
    })
</script>

</html>

计算属性:
1.定义:要用的属性不存在,要通过已有属性计算得来。
2.原理:底层借助了Objcet.defineproperty方法提供的getter和setter。
3.get函数什么时候执行?
(1).初次读取时会执行一次。
(2).当依赖的数据发生改变时会被再次调用。
4.优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。
5.备注:
1.计算属性最终会出现在vm上,直接读取使用即可。
2.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生

计算属性-简写
 get() {//get的this指向vm
                    console.log('get调用了')
                    return this.firstname + '-' + this.lastName
                },//在控制台查找vm._data的firstname,lastname都能找到,但是fullname是underfined,compute已经给了vm


fullName:function(){
    console.log('get调用')
    return this.firstName+'-'+this.lastname

}
  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值