数据绑定,defineProperty,v-on,事件处理

news2024/11/18 10:35:25

目录​​​​​​​

v-bind单向数据绑定

defineProperty

@是v-on的简写

事件处理

v-bind单向数据绑定

从name绑定到v-bind到value单向数据绑定:

<input type="text"  :value="name">
<input type ="text" v-model="name">

代码错误,因为v-model只能用在表单类输入元素上,就是value值

<h2 v-bind:x="name"></h2>

el有两种写法

data也有两种,但是到组件时候必须用函数写法否则报错

vue管理的函数一定不能写箭头函数

m模型:data中数据

view:模版

vm:视图模型

data bindings把数据摆到屏幕上

这种情况:

let number=18;
let person={

name:'xiaofang',
age:number
}

defineProperty

但是后续如果number值改变,person里的不会再随着number值改变而改变

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

这个defineProperty里的get和set特别重要:

还是前面的前提下,每次动态访问age都会提示则用get,此时修改number值,age的值会随之改变;每次动态修改age的值,会调用set,此时只会修改表面age的值,因为真实来源是number的值,除非在set里将修改后的值赋值为value

<script type="text/javascript">
        let person = {
            name: 'zhangsan',
            sex: 'nan'
        }
        //三个参数值,第一个是你要给哪个对象添加属性,添加属性叫什么名字,配置项
        Object.defineProperty(person, 'age', {
            value: 18,
            enumerable: true,//默认为false
            writable: true,//控制属性是否能被修改
            configurable: true,//控制属性是否可以被删除
            get: function () {
                console.log('hello');
                return number;


            },
            //可以把function()这边这个名字省略直接写成:get(){}
            set(value) {//当有人修改person的age时候,set调用得到修改值
                // 但是这里set虽然表面能改变age的值,age真实值不变,他来自number,与number值关联
                number = value
            }

        })
        // console.log(person);
        // // console.log(Object.keys())
        // //传入对象,所有属性的属性名提取出来,作为数组
        // console.log(Object.keys(person))
        // //for in 既能便利数组也能遍历对象

        // for (let index in person) {
        //     console.log('@', person[index]);
        // }
        // // 用三个参数哪个func添加的age不能被枚举
        //当有人读取person的age属性时
// get和set特别重要!!
    </script>

通过Object.defineProperty()把data对象中所有属性添加到vm上。
为每一个添加到vm上的属性,都指定一个getter/setter。
在getter/setter内部去操作(读/写)data中对应的数据。

数据代理提现在{{name}}与data下的name属性,_data收集了data中数据,创建实例进行数据代理

let obj1={x:1}
let obj2={y:2}

Object.defineProperty(obj,'x', {

get(){
return obj1.x
},
set(value){
obj1.x=value;
}
})

:是v-bind的简写

@是v-on的简写

@监听事件

<script type="text/javascript">
    Vue.config.productionTip = false

    var vm = new Vue({
        el: '#root',
        data: {
            name: 'shangguigu',

        },
        methods: {
            showINFO(event) {
                //如果这里写成箭头函数,就会往外找,找成全局的window
                alert('hello')
                // console.log(this)//此处的this是vm
            }
        }
        // 对象里配置方法,不用function关键词了
        //复习event target,拿到事件目标,event.target.innerText
        //所有被vue管理的函数都不能写箭头函数,不然就变成window

        // 用配置项把事件回调配置进
    })

</script>

现在函数showinfo里面只能传参一个,event,后面的都会变成undefined

<body>
    <div id="root">
        <h2>
            欢迎{{name}}

        </h2>
        <button v-on:click="showINFO">点我提示信息</button>
        <button v-on:click="showINFO1($event,66)">点我提示信息</button>
    </div>

</body>
<script type="text/javascript">
    Vue.config.productionTip = false

    var vm = new Vue({
        el: '#root',
        data: {
            name: 'shangguigu',

        },
        methods: {
            showINFO(event) {
                //如果这里写成箭头函数,就会往外找,找成全局的window
                alert('hello')
                // console.log(this)//此处的this是vm
            },
            showINFO1(event, number) {
                // 这里形参要按照showinfo的来
                //如果这里写成箭头函数,就会往外找,找成全局的window
                alert('hello')
                console.log(event, number)//此处的this是vm
            }

        }
        // 对象里配置方法,不用function关键词了
        //复习event target,拿到事件目标,event.target.innerText
        //所有被vue管理的函数都不能写箭头函数,不然就变成window

        // 用配置项把事件回调配置进
    })

</script>


​​​​​​​showinfo作为函数没有数据代理,因为后续不会更改,做数据代理是之后会改且要显示到界面上

总结:

1使用v-on:? 或者@?绑定事件,?为事件名
2事件回调需要配置在methods对象里,最终出现在vm里
3 methods里配置的函数,不用箭头函数,否则this不是vm是windows
4 methods中配置的函数,是被vue管理的函数,this指向是vm或组件实例对象
5@click="demo"   @click="demo($event)"效果一样但是后者可以传参数

事件处理

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="js/vue.js"></script>
    <style>
        * {
            margin-top: 20px;
        }

        .demo1 {
            height: 50px;
            background-color: blueviolet;

        }
    </style>
</head>

<body>
    <div id="root">
        <h2>welcome to {{name}}</h2>
        <a href="www.baidu.com" @click.prevent="showinfo">SHOW INFO</a>
        <div class="demo1" @click="showinfo">
            <button @click.stop="showinfo">show button info</button>
            <!-- 冒泡逐级向上,想阻止就从你想阻止的层数及往下的click后都加stop,一般冒泡阶段处理事件 -->
        </div>
    </div>

</body>
<script type="text/javascript">
    new Vue({
        el: '#root',
        data: {
            name: 'sun'
        },
        methods: {
            showinfo(e) {
                // e.preventDefault()这句话替代方式是@click那边改的
                alert('hello')
            }
        }
    })

</script>

vue中事件修饰符
1 prevent 阻止默认事件发生
2 stop阻止事件冒泡
3 once事件只触发一次

键盘事件

vue中常见别名:
1 回车:enter
2 删除 delete
3 退出 esc
4空格 space
5 换行 tab
6上up
 

最好通过key,即该键的键名来绑定,最好别用keyCode绑定

<body>
    <div id="root">
        <h2>welcome {{name}}</h2>
        <input type="text" placeholder="input" @keyup.enter="showinfo">
        <!-- 加上.enter代表按下空格键才会调用showinfo函数 -->
        <!-- key代表的是这个键的名字,keyCode才是这个键的编码,比如可写成caps-lock -->
        <!-- 记住,tab键不能keyup只能keydown绑定 -->
    </div>

</body>
<script type="text/javascript">
    new Vue({
        el: '#root',
        data: {
            name: 'sun'
        },
        methods: {
            showinfo(e) {
                // if (e.keyCode !== 13) return
                // 这句判断可以用键盘事件后续加enter
                console.log(e.key,e.keyCode)
                alert(e.target.value)
                // 通过keycode判断ascii大小
            }
        }
    })

</script>
Vue.config.keyCodes.huiche=13//定义别名huiche是回车

如果既要不冒泡又要不默认事件:可以如下修饰符连着写 

@click.stop.prevent

keyup对于ctrl键需要再配合一个任意键才能触发,如果想确认这个任意键,应该这样写:

@click.keyup.ctrl.y

 实现姓和名动态变化输出全名也变化:

v-bind是vue里数据绑定的界面那个属性的,所以变的是实例里的数据,界面属性随之变化

<body>
    <div id="root">
        姓:<input type="text" v-model="firstName"><br />
        名:<input type="text" v-model="lastName"><br />
        <!-- 用v-bind实现绑定效果,简写:能够获得你之前在input里输入的东西,现在要动态绑定,即你再输入要随之变化改用model,简写v-model -->
        姓名:<span>{{firstName}}-{{lastName}}</span>
        <!-- value是默认值,placeholder你一输入就跳没了 -->
    </div>

</body>
<script type="text/javascript">
    Vue.config.productionTip = false
    new Vue({
        el: '#root',
        // el确定实例操纵哪个元素
        data: {
            firstName: 'zhang',
            lastName: 'san'
        }
    })

</script>

用method完成: 

<body>
    <div id="root">
        姓:<input type="text" v-model="firstName"><br />
        名:<input type="text" v-model="lastName"><br />
        <!-- 用v-bind实现绑定效果,简写:能够获得你之前在input里输入的东西,现在要动态绑定,即你再输入要随之变化改用model,简写v-model -->
        姓名:<span>{{fullName()}}</span>
        <!-- value是默认值,placeholder你一输入就跳没了 -->
    </div>

</body>
<script type="text/javascript">
    Vue.config.productionTip = false
    new Vue({
        el: '#root',
        // el确定实例操纵哪个元素
        data: {
            firstName: 'zhang',
            lastName: 'san'
        },
        // 只要data中的数据发生变化,一定会重新解析模板,遇到插值{{}}方法一定重新调用一遍
        methods: {
            fullName() {
                console.log('@---fullname')
                return this.firstName + '-' + this.lastName
            }
        }
    })

</script>

遇到问题:总是debugger模式暂停运行:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1386226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

API可视化编排如何实现

企业随着前后端分离架构、微服务架构、中台战略、产业互联互通的实施必将产生大量的各种协议的API服务&#xff0c;API将成为企业的数字化资产且API会越来越多&#xff0c; API服务之间的相互调用和依赖情况也随之越来越多和复杂。业务系统与业务系统之间、关联企业之间的API都…

【极光系列】Windows安装Mysql8.0版本

【极光系列】Windows安装Mysql8.0版本 一.mysql服务端 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 二.解压二进制包 解压到 E:\mysql-8.0.35-winx64目录下&#xff0c;记住你解压后的目录&#xff0c;后续要使用三.创建my.ini文件 tips&#xff1a;mys…

深圳三维扫描分析/偏差检测模具型腔三维尺寸及形位偏差测量公司

CASAIM中科广电三维扫描模具型腔深圳案例&#xff1a; 模具型腔的三维扫描分析/偏差检测是一项重要的质量控制过程&#xff0c;旨在确保模具制造过程中的精确度和一致性。 CASAIM中科广电通过使用高精度的三维扫描设备&#xff0c;可以获取模具型腔的实际形状和尺寸数据&…

解决com.alibaba.fastjson.JSONException: default constructor not found的问题

1.问题描述 在进行JSON和对象互转时&#xff0c;发现有个报错&#xff1a; com.alibaba.fastjson.JSONException: default constructor not found. class com.hellobike.ph.match.service.taxi.model.message.DelayAddSkuMsg 2.原因和解决方案 通过其提示可以看出在利用fastJ…

基于 IDEA 进行 Maven 工程构建

一、构建概念和构建过程 项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程&#xff0c;在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。 项目构建是软件开发过程中至关重要的一部分&#xff0c;它能够大大提高软件开发效率&…

【TypeScript】tsconfig.json文件到底是干啥的?作用是什么?

参考学习博文&#xff1a; 掌握tsconfig.json 一、tsconfig.json简介 1、tsconfig.json是什么&#xff1f; TypeScript 使用 tsconfig.json 文件作为其配置文件&#xff0c;当一个目录中存在 tsconfig.json 文件&#xff0c;则认为该目录为 TypeScript 项目的根目录。 通常…

西贝柳斯音乐记谱软件Avid Sibelius Ultimate 2023中文激活版

Avid Sibelius(西贝柳斯终极解锁版) 是一款记谱软件&#xff0c;从有抱负的作曲家和词曲作者到教师和学生&#xff0c;任何人都可以快速轻松地开始创作和分享音乐。对于那些还不熟悉使用符号软件的人来说&#xff0c;直观的界面将引导您完成整个过程。磁性布局可防止对象相互碰…

vue中el-radio无法默认选中

页面上不生效&#xff0c;默认什么都不选中 <el-radio-group v-model"queryParams.videoUrlType"><el-radio :label"1">本地上传</el-radio><el-radio :label"2">外部链接</el-radio> </el-radio-group>da…

MS5350高精度时间测量电路

描述 MS5350 是一款高精度时间测量电路&#xff0c;它具有高精度&#xff0c;高 稳定性&#xff0c;高效率的特点&#xff1b;它的测量精度高达 15PS &#xff0c;测量范围 在 4MHZ 时从 500NS 到 16MS &#xff0c;在第一波模式情况下&#xff0c;内部比 较器的 o…

sqli-labs关卡22(基于cookie被base64编码的报错盲注)

文章目录 前言一、回顾上一关知识点二、靶场第二十二关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去…

图片里面的水印怎么去除

我们经常会在网络上看到各种带有水印的图片。那么在摄图网下载的图片都带有水印&#xff0c;我们该怎么去除让我们让图片更完美无瑕呢然而&#xff0c;这时候心中就有一个疑问了如何去除图片上的水印呢?接下来&#xff0c;我将为您介绍一种常见的方法。 那就是我们的水印云了…

如何使用LightPicture+cpolar搭建个人云图床随时随地公网访问

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…

TOP 9 安卓手机系统和应用程序修复工具,可修复各种Android 系统问题

您的新 Android 手机可能因其令人兴奋的性能而印象深刻。然而&#xff0c;随着时间的推移&#xff0c;您可能会发现系统有些地方与以前不太一样。您可能会遇到屏幕无响应、 Android应用程序崩溃、连接问题、电池耗尽等现象。 好吧&#xff0c;在这些情况下您不必感到不安&…

如何使用Docker本地搭建Traefik服务并实现公网访问管理界面

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

MIT 6s081 lab 1.Xv6 and Unix utilities

Lab1: Xv6 and Unix utilities 作业网址&#xff1a;https://pdos.csail.mit.edu/6.828/2020/labs/util.html Boot xv6(easy) 下载&#xff0c;启动xv6系统 $ git clone git://g.csail.mit.edu/xv6-labs-2020 Cloning into xv6-labs-2020... ... $ cd xv6-labs-2020 $ git …

coala,一个超级实用的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超级实用的 Python 库 - coala。 Github地址&#xff1a;https://github.com/coala/coala/ 在现代软件开发中&#xff0c;代码质量和一致性是非常重要的。然而&#xff0c…

GPT有什么用?对哪些行业帮助比较大?无际Ai带来介绍

GPT 是“Generative Pre-trained Transformer”的缩写。这是一种由 OpenAI 开发的人工智能语言模型&#xff0c;它采用了变压器&#xff08;Transformer&#xff09;架构&#xff0c;并且在大规模文本数据上进行了预训练。GPT 系列模型的目标是生成具有高度连贯性和语义合理性的…

跨国企业如何高效又安全的传输视频大文件?

在视频传输需求日益增长的今天&#xff0c;如何高效、安全地传输视频大文件成为跨国企业面临的重要问题。传统的文件传输方式存在诸多弊端&#xff0c;无法满足跨国企业对于传输效率、文件安全以及合规性的需求。那么跨国企业如何在市场是找到一种文件传输工具能在安全性、稳定…

两周掌握Vue3(三):全局组件、局部组件、Props

文章目录 一、全局组件1.创建全局组件2.在main.js中注册全局组件3.使用全局组件 二、局部组件1.创建局部组件2.在另一个组件中注册、使用局部组件 三、Props1.定义一个子组件2.定义一个父组件3.效果 代码仓库&#xff1a;跳转 本博客对应分支&#xff1a;03 一、全局组件 Vue…

map和set使用讲解

map的使用 map的介绍 map是C STL&#xff08;标准模板库&#xff09;中的一个关联容器。 它提供了一种有序的键值对存储方式&#xff0c;其中每个元素都由一个键和一个值组成。 map中的元素根据键的值自动进行排序&#xff0c;并且通过键快速访问对应的值。 map使用红黑树数…