Vue(监测数据改变、收集表单数据、过滤器)

news2024/10/7 1:26:41

一、监测数据改变原理

1. 监测对象数据改变原理

当数据发生改变之后:直接会显示数据改变(一种强硬写法)

  let data = { name: "北京大学", address: "北京" };
    // 以下通过temp进行监视:还得还原temp值(硬写)
    let temp = "北京大学";
    setInterval(() => {
      if (data.name !== temp) {
        console.log("name被改了");
        temp = data.name;
      }
    }, 100);

 当对象数据发生变化之后就会调用观察构造函数

  • 通过构造观察构造函数
  • 将传入数据转为数组并进行遍历
  • 遍历加入回调函数(箭头函数),通过defineProperty添加或者获取数据
  • 然后进行实例化并吧实例化得数据给vm实例和data
let data = { name: "北京大学", address: "北京" };
const obs = new Observer(data);
    // 准备vm实例
    let vm = {};
    //三连等就可以通过data获取实例对象
    vm._data = data = obs;
    // 创建观察构造函数
    function Observer(obj) {
      // 汇总对象的多所有属性形成数组
      const keys = Object.keys(obj);
        //遍历当前数组
      keys.forEach((k) => {
        // 当前this指的是实例对象(相当于给实例对象中添加属性)当前this是实例对象
        Object.defineProperty(this, k, {
          get() {
            // 返回传入对象的值
            return obj[k];
          },
          set(val) {
            // 只要对象内容发生修改,就会调用set进行修改然后解析模板
            console.log(`此处修改${k},需要重解析`);
            obj[k] = vla;
          },
        });
      });
    } 

2. 监测对象数据改变中的v-set使用

添加一个初始没有在data中定义一个性别属性值(没有响应式)

  • 在初始定义得值模板解析之后都会存在getter和setter,但是通过直接添加是没有响应式

   <div id="root">
      <h2>学校名称:{{school.name}}</h2>
      <h2>学校地址:{{school.address}}</h2>
      <h2>校长名字:{{school.leader}}</h2>
      <hr />
      <!-- ---------------------------------- -->
      <h2>学生信息</h2>
      <button @click="addSex">添加一个性别属性,默认值是男</button>
      <h2>学生姓名:{{students.name}}</h2>
      <!-- 添加 -->
      <h2 v-if="students.sex">学生性别:{{students.sex}}</h2>
      <h2>
        学生年龄:真实年龄{{students.age.rAge}},对外年龄{{students.age.rAge}}
      </h2>
      <ul>
        <li v-for="(f,index) in students.friends" :key="index">
          {{f.name}}--{{f.age}}
        </li>
      </ul>
    </div>
  </body>
  <script>
    Vue.config.production = false;
    const vm = new Vue({
      el: "#root",
      data: {
        school: { name: "北京大学", address: "北京" },
        students: {
          name: "tom",
          age: { rAge: 40, sAge: 20 },
          friends: [
            {
              name: "toy",
              age: 15,
            },
            {
              name: "boom",
              age: 20,
            },
          ],
        },
      },
      methods: {
        //添加一个属性得api
        addSex() {
          // Vue.set(this.students, "sex", "男");
          this.$set(this.students, "sex", "男");
        },
      },
    });
  </script>

 

 解决:

  • 通过Vue.set(target,name,value) 进行响应式添加

  • 通过vm.$set(target,name,value)进行响应式添加

 

 

 

 

 

3. 监测数组数据改变 

监测对象数据时候是通过getter和setter进行监测和响应式获取数据

 

但是在监测数组数据变化时候就不奏效:数组在vue中没有getter和setter方法

 说明数组下标修改数据不会被vue监视

 

解决: 数组对于元素得增删改查通过数组方法(非arr数组方法)

  • push : 末尾添加(返回index)

 

  • pop :末尾删除

  • shift :第一个删除(返回删除数组元素)

 

  • unshift :第一个添加

  • splice(a,b,item) :指定位置删除:标识从a开始删除b个插入item

 这里补充上一章改变马老师响应式的解决方法:

 this.persons.splice(0, 1, {
            id: "001",
            name: "马老师",
            age: 50,
            sex: "男",
          });
  • sort :排列

  • reverse : 反转

  <div id="root">    
  <h2>爱好</h2>
      <ul>
        <!-- 遍历对象或者数组都是v-for指令 -->
        <li v-for="(h,index) in students.hobby" :key="index">{{h}}</li>
      </ul>
    </div>
 data: {
        school: {
          name: "北京大学",
          address: "北京",
        },
        students: {
          name: "tom",
          age: {
            rAge: 40,
            sAge: 20,
          },
          hobby: ["抽烟", "喝酒", "烫头"],
          friends: [
            {
              name: "toy",
              age: 15,
            },
            {
              name: "boom",
              age: 20,
            },
          ],
        },
      },

判断数组方法得区别:

  • 数组方法等于数组原型对象上的方法

  •  vue上的数组方法对模板进行解析

 当然也可以直接通过$set-api进行添加响应式:

 

 

 4. Vue监视数据原理总结

vue会监视data中所有层次的数据

如何监视对象中的数据?

  • 通过setter实现监视,并且new Vue时候就要传入检测数据
    (1)对象中后追加的属性,Vue默认不做响应处理
    (2)如果需要给后追加的属性做响应式,请使用如下API:
    Vue.set(target,propertyName/index,value)或者
    vm.$set(target,propertyName/index,value)

如何检测数组中的数据?

  • 通过包裹数组更新元素的方法实现,本质就是做了两件事:
    (1)调用原生对应的方法对数组进行更新
    (2)重新解析模板,进而更新页面

在Vue修改数组中的某个元素要用如下方法

  1. 使用这些API:push(),pop(),shift(),unshift(),splice(),sort(),reverse()

  2. Vue.set(),vm.$set()

    >>> 特别注意:Vue.set()和vm.$set()不能给vm或vm的根数据对象添加属性

二、收集表单数据 通过v-model

1. 表单数据通过vue管理

  • 账号、密码直接使用v-model进行双向绑定

  • 单选框通过双向绑定之后还需要给每个单选添加一个value值:需要默认值直接在vue的data中添加value值

  • 多选框 

    • 通过双向绑定之后,给每个选项添加一个value值

    • 没有配置input的value属性,那么收集的就是checked(勾选or 未勾选:都是布尔值)

  • select选项框

    • 也是双向绑定和数据的value值,然后通过设置选项初始值进行设置默认选项

  • 最后通过json数据处理再通过form进行数据传输或者btn进行传输上传

备注:v-model的三个修饰符:
                    lazy:失去焦点再收集数据(而不是实时收集)
                    number:输入字符串转为有效的数字
                    trim:输入首位空格过滤

 <div id="root">
      <!-- 原本使用action通过ajax页面不刷新发送数据 -->
       <!--这里通过表单绑定一个提交事件,并阻止默认事件-->
      <form @submit.prevent="demo">
        账号:<input type="text" v-model.trim="useInfo.account" />
        <br />
        <br />
        密码:<input type="text" v-model="useInfo.passward" />
        <br />
        年龄:<input type="number" v-model.number="useInfo.age" />
        <br />
        <br />
        性别:
        <!-- 区分性别单选使用name:并且没有value值 -->
        男<input type="radio" name="sex" v-model="useInfo.sex" value="male" />
        女<input type="radio" name="sex" v-model="useInfo.sex" value="fmale" />
        <br />
        <br />
        爱好:
        <!-- 多选框 :数组-->
        学习<input type="checkbox" v-model="useInfo.hobby" value="learn" />
        <!--  -->
        打游戏<input type="checkbox" v-model="useInfo.hobby" value="game" />
        <!--  -->
        吃饭<input type="checkbox" v-model="useInfo.hobby" value="eat" />
        <br />
        <br />
        所选地区:<select v-model="useInfo.city">
          <option value="">请选择校区</option>
          <option value="beijing">北京</option>
          <option value="shanghai">上海</option>
          <option value="shenzhen">深圳</option>
        </select>
        <br />
        <br />
        其他信息
        <textarea v-model.lazy="useInfo.other"></textarea>
        <br />
        <br />
        //这里的checkboc的只接受布尔值
        <input type="checkbox" v-model="useInfo.aggree" />阅读并接收信息:<a
          href="www.baidu.com"
          >请详细阅读</a
        >

        <button>注册</button>
      </form>
    </div>
    <script>
      Vue.config.production = false;
      const vm = new Vue({
        el: "#root",
        data: {
          useInfo: {
            account: "",
            passward: "",
            sex: "male",
            hobby: [],
            city: "beijing",
            other: "",
            aggree: "",
            age: 18,
          },
        },
        methods: {
          demo() {
            console.log(JSON.stringify(this.useInfo));
          },
        },
      });
    </script>

三、过滤器 (非必要)

需求:页面中显示格式化后的时间:时间戳

 Date.now()生成的数据转为年月日-时分秒

解决:第三方库moment(重量级)/day(轻量级)是第三方的库两个库api同步引入到文件中

https://github.com/iamkun/dayjs/blob/dev/docs/zh-cn/README.zh-CN.mdicon-default.png?t=N3I4https://github.com/iamkun/dayjs/blob/dev/docs/zh-cn/README.zh-CN.mdapi

  1. 计算属性:

 computed: {
        fameTime() {
          return dayjs(this.time).format("YYYY-MM-DD HH-mm-ss");
        },
      },

2. 方法:

 methods: {
        getFumTime() {
          return dayjs(this.time).format("YYYY-MM-DD HH-mm-ss");
        },
      },

3. 过滤器实现:

    filters: {
        timeFormater(value) {      
          return dayjs(value).format("YYYY-MM-DD HH-mm-ss");
        },
      
      }

   filters: {
        //这里可以给过滤函数添加第二个参数作为默认参数进行转换格式
        timeFormater(value,str='YYYY-MM-DD HH-mm-ss') {      
          return dayjs(value).format(str);
        },
      
      }

过滤器:数据 | 过滤

过滤过程:将数据传给过滤器函数然后使用通用api-format返回一个格式化值

过滤器还可以使用串联过滤方式进行过滤:查看下方的串联过滤器使用方式

还有过滤器可以声名全局过滤器

  Vue.filter("mySilice", function (value) {
      return value.slice(0, 4);
    });

    <div id="root">
      <h2>显示格式化后的时间</h2>
      <!-- 计算属性实现:时间戳变为可以看懂的时间 -->
      <h3>现在的时间是:{{fameTime}}</h3>
      <!-- 方法实现:时间戳变为可以看懂的时间:方法再插值语法中需要使用() -->
      <h3>现在的时间是:{{getFumTime()}}</h3>
      <!-- 过滤器属性实现:时间戳变为可以看懂的时间(过滤器本质就是函数) -->
      <h3>现在的时间是:{{time | timeFormater}}</h3>
      <!-- 多个过滤器可以串联 -->
      <h3>
        现在的时间是:{{time | timeFormater("YYYY-MM-DD HH-mm-ss") | mySilice}}
      </h3>
      <!-- 除了插值语法可以使用过滤器:数据绑定也可以:查看控制台结构,但是不允许使用双向绑定 -->
      <h2 :bind="msg | mySilice">这里是数据绑定过滤器用法</h2>
    </div>
    <!-- 使用全局过滤器:每一个过滤器都是单一包裹的 -->
    <div id="root2">
      <h2>{{msg | mySilice}}</h2>
    </div>
  </body>
  <script>
    Vue.config.production = false;
    // 全局过滤器
    Vue.filter("mySilice", function (value) {
      return value.slice(0, 4);
    });
    const vm = new Vue({
      el: "#root",
      data: {
        time: 1681109185734,
        msg: "nihaoya",
      },
      // 通过方法直接使用库api进行数据转换
      computed: {
        fameTime() {
          return dayjs(this.time).format("YYYY-MM-DD HH-mm-ss");
        },
      },
      methods: {
        getFumTime() {
          return dayjs(this.time).format("YYYY-MM-DD HH-mm-ss");
        },
      },
      // 局部过滤器
      filters: {
        //使用es6中形参默认值:将传入的参数值转为以下格式
        timeFormater(value, str = "YYYY-MM-DD") {
          // console.log("@", value);
          // 这里的模板字符可以使用字符串格式(作为第二个参数)
          // return dayjs(value).format("YYYY-MM-DD HH-mm-ss");
          return dayjs(value).format(str);
        },
        mySilice(value) {
          return value.slice(0, 4);
        },
      },
    });
    // 第二个实例
    const vm2 = new Vue({
      el: "#root2",
      data: {
        msg: "xlf-nihao",
      },
    });
  </script>

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

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

相关文章

k8s 部署 ldap 服务

1、创建挂载卷&#xff0c;将数据和配置进行持久化存储 1.1、使用nfs作为共享存储 [rootlocalhost openldap_yaml]# cat /etc/exports /dump_file/openldap_db 172.21.53.0/24(rw,sync,no_root_squash,no_all_squash) /dump_file/openldap_conf 172.21.53.0/24(rw,sync,no_roo…

【Linux常见指令以及权限理解】基本指令(1)

写在前面&#xff1a; 相信看完上一个博客&#xff0c;我们已经成功搭建好了Linux环境&#xff0c; 如果没有可以去看看&#xff1a;Linux环境搭建。 接下来我会讲述Linux的常见指令以及权限理解相关内容。 这篇文章会介绍一些常用的Linux指令并穿插一些操作系统的概念理解…

巧用千寻位置GNSS软件|一文教会横断面测量

测横断面主要用于线路工程和水利工程的前期设计中&#xff0c;在线路平曲线设计好之后&#xff0c;千寻位置GNSS软件可用于在中桩处测定垂直于线路中线方向原地貌的地面起伏的数据&#xff0c;本期就为大家介绍具体的操作技巧。 点击【测量】->【测横断面】&#xff0c;选择…

ByteHouse云数仓版查询性能优化和MySQL生态完善

ByteHouse云数仓版是字节跳动数据平台团队在复用开源 ClickHouse runtime 的基础上&#xff0c;基于云原生架构重构设计&#xff0c;并新增和优化了大量功能。在字节内部&#xff0c;ByteHouse被广泛用于各类实时分析领域&#xff0c;最大的一个集群规模大于2400节点&#xff0…

( 栈和队列) 20. 有效的括号 ——【Leetcode每日一题】

❓20. 有效的括号 难度&#xff1a;简单 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;]的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合…

决策树入门、sklearn实现、原理解读和算法分析

文章目录 决策树入门决策树sklean实现决策树算法单/多变量决策树CART分类树算法 决策树分析复杂度控制特征重要性决策树特点 决策树入门 总算来到心心念念的决策树了。工作中一直在用xgb模型&#xff0c;今天开始&#xff0c;终于可以尝试去理解其背后的算法原理了。不过xgb较…

软件开发全套文档案例分享

写在前面 在日常项目开发过程中&#xff0c;会产生大量的过程文档&#xff0c;比如开发过程中的文档、管理过程中的文档、产品相关文档等等&#xff0c;那这些文档我们日常怎么去管理呢&#xff1f;怎么去做规划呢&#xff1f;如何做成通用标准呢&#xff1f;小编特地整理了一…

问卷中多选题如何分析?

一、案例与问卷 本研究选取大学生作为研究对象&#xff0c;旨在通过理财认知、理财现状、理财偏好三个方面&#xff0c;对大学生理财产品了解情况、使用需求进行调查。本次问卷共分为四个部分&#xff1a;第一部分共5道题&#xff0c;为基本信息题&#xff1b;第二部分共3道题…

换肤实现及LayoutInflater原理

文章目录 背景实现换肤步骤解析插件 apk 的包信息获取插件 apk 的 Resources 对象替换资源 简单的插件化换肤实现和存在的问题换肤如何动态刷新&#xff1f;控件换肤刷新的性能考虑如何降低 xml 布局中 View 的替换成本LayoutInflater 原理LayoutInflater.Factory2 替换 View 小…

antDesignPro6: 如何设置环境变量,取值自动根据不同环境,动态修改(3步)。

官网文档&#xff1a;环境变量 - Ant Design Pro Pro 脚手架默认使用 Umi 作为底层框架&#xff0c;在 Umi 内可通过指定 UMI_ENV 环境变量来区分不同环境的配置文件&#xff0c;UMI_ENV 需要在 package.json 内配置。当 UMI_ENV 为 test 时&#xff0c;则必须在 config 目录下…

二十、线索关联市场活动(二):关联

功能需求 用户在线索明细页面,点击"关联市场活动"按钮,弹出线索关联市场活动的模态窗口; 用户在线索关联市场活动的模态窗口,输入搜索条件,每次键盘弹起,根据名称模糊查询市场活动,把所有符合条件的市场活动显示到列表中; 用户选择要关联的市场活动,点击"关联…

电销CRM客户关系管理系统开发12大核心功能

电销CRM管理系统软件是一款专门针对电销行业开发的客户关系管理软件&#xff0c;它能够帮助企业实现对顾客信息的可视化&#xff0c;智能化&#xff0c;自动化管理&#xff0c;提高电销效率和客户满意度。电销行业在传统互联网营销&#xff0c;新媒体营销&#xff0c;短视频营销…

PINNs与DeepXDE:加速物理计算模型

《AIScience系列&#xff08;一&#xff09;&#xff1a;飞桨加速CFD&#xff08;计算流体力学&#xff09;原理与实践》 https://baijiahao.baidu.com/s?id1728002499252273827&wfrspider&forpc 前言 AIScience专栏由百度飞桨科学计算团队出品&#xff0c;给大家带来…

dubbogo中将kubernetes作为注册中心 -- 阅读官方文档

Kubernetes服务发现模型 为了明确 K8s 在服务接入管理提供的解决方案&#xff0c;我们以 kube-apiserver 提供的 API(HTTPS) 服务为例。K8s 集群为该服务分配了一个集群内有效的 ClusterIP &#xff0c;并通过 CoreDNS 为其分配了唯一的域名 kubernetes 。如果集群内的 Pod 需…

不用先存盘直接显示附件内容

大家好&#xff0c;才是真的好。 有些需求总是很小众&#xff0c;但是还是被人需要。 Notes从来可以满足这种需求。 其实使用Notes客户机可以直接打开嵌入到文档中的附件&#xff0c;例如Txt文本、Word或PDF附件等。 不过有人提出&#xff0c;能否直接从Notes文档中的附件读…

CDGP|数据监管越来越严,数据治理发展何去何从?

尽管数据监管越来越严格&#xff0c;但仍然存在许多机会。事实上&#xff0c;数据监管的加强可能会促进金融科技行业更好地运用数据&#xff0c;激发金融科技行业更多的创新和合作,创造更多的价值和机会。 推动金融机构重视数据安全和隐私保护 促使他们采取更严格的安全措施&a…

尚硅谷大数据技术Spark教程-笔记05【SparkCore(核心编程,累加器、广播变量)】

视频地址&#xff1a;尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01【SparkCore&#xff08;概述、快速上手、运行环境、运行架构&#xff09;】尚硅谷大数据技术Spark教程-笔记02【SparkCore&#xff08;核心编程&#xff0c;RDD-核…

系统日志管理审核

系统日志管理 系统日志记录协议 &#xff08;syslog&#xff09; 旨在标准化网络设备用于与日志服务器通信的消息格式。网络上的路由器、交换机、防火墙和 Unix/Linux 服务器等许多设备都支持它&#xff0c;从而更轻松地管理这些设备生成的日志。系统日志监控和管理对于每个组…

基于GPT-4的 IDEA 神仙插件,无需魔法,亲测好用!

近日&#xff0c;Intellij IDEA的插件商店&#xff0c;悄然上线了一个新的插件——Bito&#xff0c;据说可以基于GPT-4和ChatGPT来写代码。短短几天&#xff0c;已经有50多K的下载量了。 我帮大家试用了一下&#xff0c;亲测好用&#xff01; 根据插件介绍显示&#xff0c;Bito…

《面向基于人工智能的学习健康系统,使用心电图进行人群水平的死亡率预测》阅读笔记

目录 一、摘要 二、十个问题 Q1论文试图解决什么问题&#xff1f; Q2这是否是一个新的问题&#xff1f; Q3这篇文章要验证一个什么科学假设&#xff1f; Q4有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课题在领域内值得关注的研究员&#xff1f; Q5论文中提到…