Vue基础(2)检测数据原理~生命周期

news2024/11/24 17:10:09

文章目录

  • 检测数据原理
    • 1.更新时遇到的问题
    • 2.检测数据的原理-对象
    • 3. vue.set()的使用
  • 收集表单数据
  • 过滤器
  • 内置指令
    • 1.v-text
    • 2.v-html
    • 3.v-cloak
    • 4.v-once
    • 5.v-pre
  • 自定义指令
  • 生命周期
    • 1.挂载流程
    • 2.更新流程
    • 3.销毁流程

检测数据原理

1.Vue会监视data中的所有层次的数据
2.如何监测对象中的数据 通过setter监视,且要在new Vue时就检测数据
(1).对象中后追加的属性,Vue默认不做响应式原理
(2)如需给后添加的属性做响应式,请用如下API

    Vue.set(target,propertyName/index,value)或
    vm.$set(target,propertyName/index,value)

3.如何监测数组中的数据?
通过包裹数组更新元素的方法实现,本质就是做了两件事
(1)调用原生对应的方法对数组进行更新
(2)重新解析模版,进而更新页面
4.在Vue修改数组中的某个元素一定要用如下方法:
(1)使用这些API:push(),pop(),shift(),unshift(), splice(),sort(),reverse()
(2) Vue.set() 或vm. s e t ( ) 特别注意: V u e . s e t ( ) 和 v m . set() 特别注意:Vue.set() 和vm. set()特别注意:Vue.set()vm.set() 不能给vm或vm的根数据对象添加属性

数据劫持:意思就是,把data里的所有属性加上set、get 就叫劫持

<div id="root">
  <h2>学生信息</h2>
  <button @click="student.age++">年龄+1岁</button>
  <button @click="addSex">添加性别属性 默认值为男</button>
  <button @click="student.sex='未知'">修改性别属性</button>
  <button @click="addFriend">在列表首位添加一个朋友</button>
  <button @click="updateFirstFriendName">
    修改第一个朋友的名字是:张三
  </button>
  <button @click="addHobby">添加一个爱好</button>
  <button @click="updateHobby">修改第一个爱好为:开车</button>
  <button @click="removeSmoke">过滤掉爱好中的抽烟</button>
  <h2>姓名:{{student.name}}</h2>
  <h2>年龄:{{student.age}}</h2>
  <h2 v-if="student.sex">性别:{{student.sex}}</h2>
  <h2>爱好</h2>
  <ul>
    <li v-for="h in student.hobby">{{h}}</li>
  </ul>
  <h2>朋友</h2>
  <ul>
    <li v-for="f in student.friends">{{f.name}}--{{f.age}}</li>
  </ul>
</div>
</body>
<script type="text/javascript">
  const vm = new Vue({
    el: "#root",
    data: {
      student: {
        name: "TOM",
        age: 18,
        friends: [
          { name: "jerry", age: 35 },
          { name: "tony", age: 36 },
        ],
        hobby: ["抽烟", "喝酒", "烫头"],
      },
    },
    methods: {
      addSex() {
        //   Vue.set(this.student, "sex", "男");
        vm.$set(this.student, "sex", "男");
      },
      addFriend() {
        this.student.friends.unshift({ name: "sunny", age: 30 });
      },
      updateFirstFriendName() {
        this.student.friends[0].name = "张三";
      },
      addHobby() {
        this.student.hobby.push("打游戏");
      },
      updateHobby() {
        //   this.student.hobby.splice(0, 1, "开车");
        Vue.set(this.student.hobby, 0, "开车");
      },
      removeSmoke() {
        this.student.hobby = this.student.hobby.filter((h) => {
          return h !== "抽烟";
        });
      },
    },
  });
</script>

1.更新时遇到的问题

在这里插入图片描述
当使用注释的方法时,在页面上点击按钮 数据会实时更新
但是如果直接整个修改索引为0的数据,点击按钮,页面数据并不会更新,但是在控制台中打印vue,数据已经更新过了
我的理解: 当data中的数据被更改时,vue的底层会调用setter,从而实现对页面的监测和实时修改的作用。但若是直接替换掉整个数据的话,就会跳过setter,所以vue无法监测并修改页面信息。

2.检测数据的原理-对象

在这里插入图片描述
在这里插入图片描述

3. vue.set()的使用

不能直接给Vue实例的根数据对象添加属性 也不能给vue实例添加属性
Vue.set(vm.data,‘属性名’,‘属性值’) 不行
Vue.set(vm,‘属性名’,‘属性值’)也不行

收集表单数据

若 则v-model收集的是value值,用户输入的就是value值 若 则v-model收集的是value值 且要给标签设置value值 若
1.没有配置input的value属性:那么收集的就是checked (勾选or 未勾选 是布尔值)
2.配置input的value属性:
(1)v-model的初始值是非数组 那么收集的就是checked (勾选or 未勾选 是布尔值)
(2)v-model的初始值是数组,那么收集的就是value组成的数组 备注:v-model 的三个修饰符:
lazy:失去焦点再收集数据
number:输入字符串转为有效数字

过滤器

定义:对要显示的数据进行特定格式化后再显示(适用于一些简单的逻辑处理) 语法:
1.注册过滤器:Vue.filter(name,callback) 或 new Vue{ filters:{}}
2.使用过滤器 :{{ xxx | 过滤器名}} 或 v-bind:属性=“xxx | 过滤器名” 备注:
1.使用过滤器也可以接收额外参数、多个过滤器也可以串联
2.并没有改变原本的数据,是产生新的对应的数据

注意: 并没有改变原本的数据,是产生新的对应数据

 <div id="root">
      <h2>显示格式化后的时间</h2>
      <!-- 计算属性实现 -->
      <h2>现在是:{{fmtTime}}</h2>
      <!-- methods实现 -->
      <h2>现在是:{{getFmtTime()}}</h2>
      <!-- 过滤器实现 -->
      <h2>现在是:{{time | timeformater()}}</h2>
      <!-- 过滤器实现(传参) -->
      <h2>现在是:{{time | timeformater("YYYY-MM-DD") | mySlice}}</h2>
      <h3>尚硅谷</h3>
    </div>
    <div id="root2">
      <h2 :x="msg | mySlice">{{msg | mySlice}}</h2>
    </div>
  </body>

  <script type="text/javascript">
    //   全局过滤器
    Vue.filter("mySlice", function (value) {
      return value.slice(0, 4);
    });
    const vm = new Vue({
      el: "#root",
      data: {
        time: 1621561377603,
        msg: "hello,尚硅谷",
      },
      computed: {
        fmtTime() {
          return dayjs(this.time).format("YYYY-MM-DD HH:mm:ss");
        },
      },
      methods: {
        getFmtTime() {
          return dayjs(this.time).format("YYYY-MM-DD HH:mm:ss");
        },
      },
      //   局部过滤器
      filters: {
        timeformater(value, str = "YYYY-MM-DD HH:mm:ss") {
          return dayjs(value).format(str);
        },
        mySlice(value) {
          return value.slice(0, 4);
        },
      },
    });
    new Vue({
      el: "#root2",
      data: {
        msg: "hello world",
      },
    });
  </script>

内置指令

学过的指令:
v-bind :单向绑定解析表达式,可简写为XXX
v-model:双向数据绑定
v-for:遍历数组/对象/字符串
v-on:绑定事件监听,可简写为@
v-if:条件渲染(动态控制节点是否存在)
v-else:条件渲染(动态控制节点是否存在)
v-show:条件渲染(动态控制节点是否展示)

1.v-text

(1)作用:向其所在的节点中渲染文本内容
(2)与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会

2.v-html

1.作用:向指定的节点中渲染包含html结构的内容
2.与插值语法的区别:
(1).v-html会替换掉节点中所有的内容,{{xx}}则不会。
(2).v-html可以识别html结构。
3.严重注意:v-html有安全性问题!!!
(1).在网站上动态渲染任意HTML是非常危险的,容易导致xss攻击。
(2).一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!

3.v-cloak

没有值
本质上是一个特殊属性,Vue实例创建完毕并接管容器口,会删掉v-cloak属性
使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题

理解:如下方
当红色的js代码加载需要一段时间时,由于vue实例并没有解析模版,页面上会显示{{}}
如果使用v-cloak 会让代码在加载前,具有该属性的元素不在页面上显示,加载完毕后才可以显示

在这里插入图片描述

4.v-once

v-once所在节点初次动态渲染后,就视为静态内容了
以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能

在这里插入图片描述

5.v-pre

跳过其所在节点的编译过程 可利用它跳过:没有使用指令的语法,没有使用插值语法的节点,会加快编译

自定义指令

一、定义语法:
(1)局部指令:
(2)全局指令:
二、配置对象中常用的三个回调
(1)bind 指令与元素成功绑定时调用
(2)inserted:指令所在元素被插入页面时调用
(3)update:指令所在模版结构被重新解析时调用
三、备注:
1.指令定义时不加v- 但使用时要 v-
2.指令名如果是多个单词,要使用x-x命名方式 不要用驼峰

注意:指令中所有的this都是window 与是否是箭头函数 普通函数无关

  <body>
    <!-- 定义v-big指令 与v-text功能类似 但会把绑定的数值放大10倍。 -->
    <!-- 定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点 -->
    <div id="root">
      <h2>当前的n值是:<span  v-text="n"></span></h2>
      <h2>放大的n值是:<span  v-big="n"></span></h2>
      <hr>
      <button @click="n++">点我n+1</button>
    
      <input type="text" v-fbind:value="n"></input>
    </div>
  </body>
  <script type="text/javascript">
    //   全局指令
    Vue.directive('fbind2',{
         // 指令与元素成功绑定时(一上来)
         bind(el,binding){
                console.log(this);//注意此处的this是window
                console.log(binding);
                
                el.value = binding.value
            },
            // 指令所在元素被插入页面时
            inserted(el,binding){
                el.focus()
            },
            // 指令所在模版被重新解析时
            update(el,binding){
                el.value = binding.value
                el.focus()
            },
    })
    const vm = new Vue({
      el: "#root",
      data: {
      n:1
      },
    //   局部指令
      directives:{
        // big函数何时被调用? 
        // 1.指令与元素成功绑定时(一上来)
        // 2.指令所在模版被重新解析时(任一属性改变)
        big(el,binding){
            console.log('big',this);//注意此处的this是window
          el.innerText = binding.value * 10
        },
        
        fbind:{
            // 指令与元素成功绑定时(一上来)
            bind(el,binding){
                console.log(this);//注意此处的this是window
                el.value = binding.value
            },
            // 指令所在元素被插入页面时
            inserted(el,binding){
                el.focus()
            },
            // 指令所在模版被重新解析时
            update(el,binding){
                el.value = binding.value
                el.focus()
            },
            
        }
      }
    });
  </script>

生命周期

1.又名:生命周期回调函数、生命周期函数、生命周期钩子
2.是什么:Vue在关键时刻帮我们调用一些特殊名称的函数
3.生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的
4.生命周期函数中的this指向是vm 或组件实例对象

常用生命周期钩子:
1.mounted:发送ajax请求,启动定时器,绑定自定义事件,订阅消息等【初始化操作】
2.beforeDestroyed:消除定时器,解绑自定义事件,取消订阅消息等【收尾工作】 关于销毁Vue实例:
(1).销毁后借助Vue开发者工具看不到任何消息
(2).销毁后自定义事件会失效,但原生DOM事件依然有效(高版本无效)
销毁后无法再调用自定义事件(失效),但已经执行了的自定义事件仍在运行(定时器一直跑)
3. 一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了

在这里插入图片描述
在这里插入图片描述

1.挂载流程

在这里插入图片描述

2.更新流程

在这里插入图片描述

3.销毁流程

在这里插入图片描述

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

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

相关文章

10月8日星期二今日早报简报微语报早读

10月8日星期二&#xff0c;农历九月初六&#xff0c;早报#微语早读。 1、我国自主研制的300兆瓦级F级重型燃气轮机在上海首次点火成功&#xff1b; 2、2024国庆档超21亿收官&#xff1a;《志愿军&#xff1a;存亡之战》票房8亿夺冠&#xff1b; 3、维克托安布罗斯&#xff0…

STM32工程环境搭建(库函数开发)

目录 1、移植固件库&标准库 2、新建工程 以STM32f401作为例子进行环境搭建 1、移植固件库&标准库 ①桌面创建工程文件夹并且提取内核文件 用户文件&#xff1a;用户自己编写的程序文件 .c .h文件 .c文件&#xff1a;具体函数功能源代码 .h文件&#xff1a;宏定义…

ctf.bugku - bp (弱密码top1000)

题目来源&#xff1a; bp - Bugku CTF 首先&#xff0c;下载top1000 &#xff0c;弱密码文本&#xff1a; PasswordDic/top1000.txt at master k8gege/PasswordDic GitHub 访问页面&#xff0c;随便输入个密码 发送请求到 intruder 以密码问参数 加载top1000.txt 密码文本&…

springboot开发网站-使用redis数据库定时特征限制指定ip的访问次数

springboot开发网站-使用redis数据库定时特征限制指定ip的访问次数。近期网站经常有人恶意访问&#xff0c;提交了很多垃圾信息。为了屏蔽这类灌水帖&#xff0c;打算屏蔽ip地址&#xff0c;限制24小时内只能访问1次某个接口。下面是测试的案例代码内容。 1&#xff1a;首先&am…

实验三 Web基础-JavaScript

实验三 Web基础-JavaScript 目的&#xff1a; 1、理解和掌握Javascript基本语法 2、掌握JavaScript操作表单对象的方法 3、理解和掌握JavaScript的函数与事件 4、理解JavaScript的内置对象 实验要求&#xff1a; 1、使用JavaScript语言实现实验要求 2、要求提交实验报告&…

HTB:Pennyworth[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What does the acronym CVE stand for? 2.What do the three letters in CIA, referring to the CIA triad in cybersecurity, stand for? 3.What is the version of the service running on port 8080? 4.What version of Jenkins i…

【C++11】可变模板参数

文章目录 可变模板参数的概念递归函数方式展开参数包 STL容器中的empalce相关的接口函数emplace 与 insert / push_back 的区别 可变模板参数的概念 可变参数模板是 C11 引入的一种模板特性&#xff0c;允许定义可以接收任意数量参数的模板&#xff0c;广泛应用于函数和类的设计…

【js逆向学习】极志愿 javascript+python+rpc

JSRPC使用方式 逆向目标逆向过程逆向分析1、什么是 websocket2、websocket的原理3、总体过程3.1 环境说明3.2 python服务端代码3.3 python客户端代码 4、Sekiro-RPC4.1 执行方式4.2 客户端环境4.3 参数说明4.4 SK API4.5 python代码调试4.6 代码注入流程 逆向总结 逆向目标 网…

【STM32开发之寄存器版】(六)-通用定时器中断

一、前言 STM32定时器分类 STM32103ZET6具备8个定时器TIMx(x 1,2,...,8)。其中&#xff0c;TIM1和TIM8为高级定时器&#xff0c;TIM2-TIM6为通用定时器&#xff0c;TIM6和TIM7为基本定时器&#xff0c;本文将以TIM3通用定时器为例&#xff0c;分析STM32定时器工作的底层寄存器…

mysql读写分离的最佳实践

一. 传统的读写分离方式 在 MySQL 中实现读写分离可以通过以下几种方式来达到目的&#xff1a; 1. 主从复制 使用主从复制&#xff08;Master-Slave Replication&#xff09;是实现读写分离的常见方式。 主库&#xff1a;处理所有的写入操作&#xff08;INSERT、UPDATE、DE…

Qt+VS2019+大恒相机相机回调方式总结

一、前言 大恒驱动安装完成后&#xff0c;在安装目录有SDK调用文档&#xff0c;里面有更详细的调用介绍&#xff0c;此文档对近期做的Demo做一个回顾性总结。 二、调用流程概述 三、针对性内容介绍&#xff1a; 1. 在执行相机操作之前&#xff0c;需要先执行此代码&#xff1…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07目录1. Evaluation of Large Language Models for Summarization Tasks in the Medical Domain: A Narrative Review摘要研究…

rust中async/await的使用

在Rust中&#xff0c;async/await 用于编写异步代码。它允许您以同步的方式编写异步代码&#xff0c;使得异步操作更易于理解和编写。 安装依赖&#xff1a; cargo add futures cargo add async-std 使用示例&#xff1a; 示例1&#xff1a; use async_std::task::block_o…

学习MDX

MDX&#xff08;Markdown JSX&#xff09;是一种开源的文件格式&#xff0c;它允许你在Markdown文件中使用JavaScript表达式和组件。MDX将Markdown的易用性与React组件的强大功能结合起来&#xff0c;使得你可以在编写文档、博客文章或其他内容时&#xff0c;嵌入可交互的组件…

顶会论文复现:PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

文章目录 1 资料2 我的总结3 复现源码首先你需要有gpt的api接口安装&#xff1a;数据集执行指令源码 4 结果 1 资料 我复现的源码:https://github.com/Whiffe/test_set_contamination 官网源码&#xff1a;https://github.com/tatsu-lab/test_set_contamination 论文&#x…

tts(text to speech)使用 pyttsx3 实现文本转语音 - python 实现

文本转语音&#xff08;Text-to-Speech&#xff0c;TTS&#xff09;技术是一种将文本信息转换为口语输出的技术。它涉及多个学科&#xff0c;包括声学、语言学、数学信号处理技术和多媒体技术等。TTS技术能够将计算机中的文本信息转换为自然流畅的语音输出&#xff0c;广泛应用…

OJ在线评测系统 后端微服务架构 注册中心 Nacos入门到启动

注册中心 服务架构中的注册中心是一个关键组件&#xff0c;用于管理和协助微服务之间的通信。注册中心的主要职责是服务的注册和发现&#xff0c;确保各个微服务能够相互找到并进行调用。 主要功能&#xff1a; 服务注册&#xff1a;微服务在启动时&#xff0c;将自身信息&am…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3566移植案例(下)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 OpenHarmony Camera驱动模型结构 HDI Implementation&#x…

【ubuntu】ubuntu20.04安装显卡驱动

1.安装 点击右下角Apply Changes。 等安装好之后&#xff0c;重启。 现在的nvidia驱动已经很好安装了&#xff0c;比早期时安装出现黑屏等情况好了很多。 2.验证 nvidia-smi

Mybatis plus快速使用

文章目录 Mybatis plus快速使用1.ORM2.mybatis plus介绍3.mybatis plus使用1.添加依赖2.配置信息3.启动类加入 MapperScan&#xff08;“填入mapper包的位置”&#xff09;4.创建user接口&#xff0c;在mapper中加入UserMapper接口5.mybatis-plus crud注解启动springboot项目ma…