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

目录​​​​​​​

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模式暂停运行:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring】SpringBoot 统一功能处理

文章目录 前言1. 拦截器1.1 什么是拦截器1.2 拦截器的使用1.2.1 自定义拦截器1.2.2 注册配置拦截器 1.3 拦截器详解1.3.1 拦截路径1.3.2 拦截器执行流程1.3.3 适配器模式 2. 统一数据返回格式3. 统一异常处理 前言 在日常使用 Spring 框架进行开发的时候&#xff0c;对于一些板…

什么是Java泛型?泛型在Java中应用场景

目录 一、什么是Java泛型 二、泛型类 三、泛型接口 四、泛型方法 一、什么是Java泛型 Java泛型是一种在编译时进行类型检查和类型安全的机制。它允许编写能够操作多种类型的代码&#xff0c;而不需要进行类型转换或使用Object类型。通过在定义类、接口或方法时使用泛型参数…

Arduino快速上手esp8266方案开发

认识ESP8266 ESP8266 是 Espressif Systems 生产的 Wi-Fi 片上系统 (SoC)。它非常适合物联网和家庭自动化项目&#xff0c;目前有非常高的市场普及率&#xff0c;还有更加高端的同时支持wifi和蓝牙的双核心芯片ESP32&#xff0c;可以在乐鑫官网查看完整的芯片列表。 ESP8266芯…

克服大模型(LLM)部署障碍,全面理解LLM当前状态

近日&#xff0c;CMU Catalyst 团队推出了一篇关于高效 LLM 推理的综述&#xff0c;覆盖了 300 余篇相关论文&#xff0c;从 MLSys 的研究视角介绍了算法创新和系统优化两个方面的相关进展。 在人工智能&#xff08;AI&#xff09;的快速发展背景下&#xff0c;大语言模型&…

element中el-cascader级联选择器只有最后一级可以多选

文章目录 一、前言二、实现2.1、设置popper-class和multiple2.2、设置样式 三、最后 一、前言 element-ui中el-cascader级联选择器只有最后一级可以多选&#xff0c;其它级只有展开子节点的功能&#xff0c;如下图所示&#xff1a; 可以观察到最后一级的li节点上没有属性aria-…

Python爬虫—requests模块简单应用

Python爬虫—requests模块简介 requests的作用与安装 作用&#xff1a;发送网络请求&#xff0c;返回响应数据 安装&#xff1a;pip install requests requests模块发送简单的get请求、获取响应 需求&#xff1a;通过requests向百度首页发送请求&#xff0c;获取百度首页的…

MATLAB R2023b for Mac 中文

MATLAB R2023b 是 MathWorks 发布的最新版本的 MATLAB&#xff0c;适用于进行算法开发、数据可视化、数据分析以及数值计算等任务的工程师和科学家。它包含了一系列新增功能和改进&#xff0c;如改进了数据导入工具&#xff0c;增加了对数据帧和表格对象的支持&#xff0c;增强…

pr怎么剪掉不要的部分?

在我们的日常工作中&#xff0c;剪视频的时候常常会需要把某个视频中我们不想要的地方剪掉&#xff0c;有的时候是一段&#xff0c;也有可能是好几段。但具体应该怎么样把不要的视频剪掉呢&#xff1f;其实&#xff0c;用pr软件就可以啦&#xff01;那么&#xff0c;pr怎么剪掉…

微信小程序开发WebSocket通讯

官方文档说明&#xff1a;入口 WebSocket连接的链接只支持wss加密方式&#xff0c;且只能用域名的方式 该域名还要在微信公众平台的小程序中登记才能使用&#xff0c;开发->开发管理->服务器域名->修改 该域名要和https使用的一致 以域名地址&#xff1a;dtu.aab…

2024年第02周农产品价格报告

一、摘要 农产品价格监测主要涉及对畜禽类产品、水产品、蔬菜类产品、水果类产品的价格&#xff0c;以周为单位&#xff0c;进行变化情况的数据监测。其中&#xff0c;蔬菜类产品共18种&#xff0c;分别为大白菜、西红柿、黄瓜、青椒、芹菜、土豆、白萝卜、茄子、豆角、胡萝卜…

华媒舍:高效率的新闻资讯新闻媒体宣发套餐内容推广计划方案

怎样让自己的新闻资讯可以被大众孰知&#xff0c;变成了每一个新闻媒体宣发者一同存在的困难。下面我们就给大家介绍一套高效率的新闻资讯新闻媒体宣发套餐内容推广计划方案&#xff0c;致力于帮助新闻媒体宣发者提升宣发高效率&#xff0c;提高新闻资讯的传播性。 1.新闻媒体宣…

如何通过内网穿透实现公网访问Portainer管理监控Docker容器

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风…

GoZero微服务个人探究之路(二)Go-Zero官方api demo示例探究

官方文档api-demo教程部分网址如下&#xff1a; api demo 代码生成 | go-zero Documentation 官方demo的架构如下&#xff1a; 编辑 etc包下&#xff1a; demo-api.yaml 编辑服务名称&#xff1a;demo-apiHOST地址&#xff1a;0.0.0.0监听所有可用网络接口Port地址&#…

XSKY助力首个云原生、分布式、全栈国产化银行核心系统投产上线

近日&#xff0c;。该项目是业内首个实际投产的云原生、分布式、全栈国产化的银行核心业务系统&#xff0c;是金融科技领域突破关键核心技术应用的重大实践。 在杭州银行的新一代核心系统中&#xff0c;XSKY星辰天合具备天合翔宇“一池多芯”技术的对象存储支持了核心业务模块…

每日一题 82. 删除排序链表中的重复元素 II(中等,链表)

和昨天差不多&#xff0c;今天的是把所有重复数字的节点都删除&#xff08;昨天留了一个&#xff09; 显然当我们发现重复数字时&#xff0c;需要重复的第一个数字的前一个节点才能把重复数字删完&#xff0c;所有在while循环中我们每次判断 t.next 和 t.next.next 的值是否重复…

AI模型理解误区:微调垂直行业-VS-企业专属知识库或AI助理

概述 企业定制私有化大模型的区别&#xff0c;分为训练大模型和调用大模型两种方向&#xff0c;以及企业自己的智能客服的实现方法。 - 企业定制的私有化大模型与一般的大模型不同&#xff0c;需要高成本训练。- 企业可以选择调用已经训练好的大模型来应用。- 企业可以使用向量…

Zabbix监控(1)

目录 一.什么是zabbix Zabbix 组件&#xff1a; 主动模式&#xff1a; 被动模式&#xff1a; Zabbix 工作原理&#xff1a; zabbix 监控原理&#xff1a; 二.Zabbix 6.0 部署 先安装nginx&#xff0c;php&#xff08;yum源安装&#xff09;&#xff1a; 安装nginx&…

【面试突击】Java内存模型实战

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

python的包argparse介绍

argparse是一个用来解析命令行参数的 Python 库&#xff0c;它是 Python 标准库的一部分。 1、未使用argparse: import math# 计算圆柱体的体积 def cal_vol(radius,height):vol math.pi * pow(radius,2) * heightreturn vol if __name____main__:print(cal_vol(2,4))2、使用…

Model:字符串列表模型QStringListModel

一、QStringListModel &#xff08;1&#xff09;功能&#xff1a;处理字符串列表的数据模型&#xff0c;可作为QListView的数据模型&#xff0c;在界面上显示和编辑字符串列表。 二、QStringListModel 类中的函数 1)、 QStringListModel(QObject *parent Q_NULLPTR) //构造函…