Vue2(五):收集表单数据、过滤器、自定义指令、Vue的生命周期

一、收集表单数据

爱好:
         学习<input type="checkbox" value="study" v-model="hobby">
         打游戏<input type="checkbox" value="games" v-model="hobby">
         吃饭<input type="checkbox" value="eat" v-model="hobby">

这种写法为啥一勾三个全勾呢?

(1)不配置value的话,默认收集的是checkbox,然后hobby被选为true,其他两个一看hobby是true也就选上了,但是我写了value还是不对

(2)hobby默认值不能是‘ ’

多选框要设置type、value、v-model对应的设置为数组

<body>
    <div id="root">
     <form @submit.prevent="demo">
         <!-- 填完信息把信息提交整个表单,而且防止button提交之后跳转页面 -->
         <label for="demo" >账号:</label>
         <!-- 这样写一个label,点击账号两个字就能在input框里获取焦点了 -->
         <input type="text" id="demo" v-model.trim="userInfo.account">
         <!-- .trim可以忽略   ab c  (获得ab  c) -->
         <br><br/>
         密码:<input type="password" v-model="userInfo.password">
         <br><br/>
         <!-- 账号和密码输入什么值value就是啥,但是单/多选框没法输入 -->
         年龄:<input type="number" v-model.number="userInfo.age">
         <!-- 设成type:number可以忽略用户输入的文字 v-model.number是vue提供的,输入到后台就是数字18不是字符串18-->
         <br><br/>
         性别:
         男<input type="radio" name="sex" value="man" v-model="userInfo.sex">
         女<input type="radio" name="sex" value="woman" v-model="userInfo.sex">
         <br><br/>
         爱好:
         学习<input type="checkbox" value="study" v-model="userInfo.hobby">
         打游戏<input type="checkbox" value="games" v-model="userInfo.hobby">
         吃饭<input type="checkbox" value="eat" v-model="userInfo.hobby">
         <br><br/>
         所属校区
         <select v-model="userInfo.city">
             <option value="" >请选择校区</option>
             <option value="beijing">北京</option>
             <option value="shenzhen">深圳</option>
             <option value="shanghai">上海</option>
             <option value="guangdong">广东</option>
         </select>
         <br><br/>
         其他信息:<textarea v-model.lazy="userInfo.other"></textarea>
         <!-- 加上.lazy就会失去焦点的时候再去读入写的啥,不会实时获取 -->
         <br><br/>
         <input type="checkbox" v-model="userInfo.agree">
         阅读并接受<a href="#">《用户协议》</a> 
         <button>提交</button>
     </form>
    </div>
    <script type="text/javascript">
    
    const vm=new Vue({
        el:'#root',
        data:{
            userInfo:{
                password:'',
                account:'',
                age:'',
                sex:'woman',//默认选择女
                hobby:[],
                city:'beijing',//默认值
                agree:'',
          //这样单选框就不用设置value,就一个点了就是true否则几句诗false
      
            }
            },
       methods: {
           demo(){
               console.log(JSON.stringify(this.userInfo))
               //交给后端的方法,但是直接提交data不太好
           }
       },
     
    })

v-model.lazy:实现不用实时收集,输入框失去焦点再收集
v-model.number:输入的字符串收集为数字(Vue内部做了数据转换),经常和type="number"一起用
v-model.trim:收集时去掉输入的首尾空格

二、过滤器

1.过滤器定义

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

过滤器两种用法:插值语法、v-bind

2.案例:过滤器格式化时间戳:

<body>
    <div id="root">
     <h2>显示格式化之后的时间</h2>
     <!-- 计算属性实现 -->
     <h3>现在是:{{fmtTime}}</h3>
     <!-- methods实现 -->
     <h3>现在是:{{getFmtTime()}}</h3>
     <!-- 是方法就得加()调用 -->
     <!-- 过滤器实现 要改谁就直接写它名儿-->
     <h3>现在是:{{time | timeFormaters}}</h3>
     <h3>现在是:{{time | timeFormaters('YYYY-MM-DD')}}</h3>
     <!-- 拿着time传给timeFormaters返回值直接到{{}}里面,也就是time是个参数 -->
     <!-- 过滤器可以不加(),会给你把|左边的传进去,如果加了(),第一个还是time,第二个参数是格式 -->
     <h3>现在是:{{time | timeFormaters('YYYY-MM-DD') | mySlice}}</h3>
     <!-- 拿着time传给timeFormaters,timeFormaters拿着传入的结果继续往下 -->
     <h3 :x="msg | mySlice">hhh</h3>
     <!-- 过滤器不仅可以用在插值里面 -->
    </div>
    <div id="root2">
        <h2>{{mes | mySlice}}</h2>
    </div>

    <script type="text/javascript">
    Vue.filter('mySlice',function(value){
        return value.slice(0,4)
    })
//    全局过滤器得写在new Vue之前,而且是filter不加s
    const vm=new Vue({
        el:'#root',
        data:{
            time:1710744301627,
            msg:"你好哇哇哇哇"
            },
       computed:{
           fmtTime(){
               return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss')
            //    如果dayjs后面不加参数就默认是当前时间
           }
       },
       methods:{
           getFmtTime(){
              return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss')
           }
       },
       filters:{
        timeFormaters(value,str='YYYY-MM-DD HH:mm:ss'){
            // 过滤器本质是函数
            return dayjs(value).format(str)
            // 没有格式就默认是'YYYY-MM-DD HH:mm:ss',有的话用传入的格式
        },
        
       }
    })
        // 我写的这些过滤器只能在root vue中可以用
        new Vue({
        el:'#root2',
        data:{
            mes:'hello',
        }
        })
    </script>
</body>

三、自定义指令

1.内置指令

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

v-text:向其所在的节点中渲染文本内容。

<div>{{name}}</div>
<div v-text="name"></div>

当data中name=‘尚硅谷’的时候,这两段显示出来没有什么区别

但是插值用的更多,因为可以这样写:

<div>你好哇{{name}}</div>

而v-text把所有内容当文本会替换掉整个div 的内容,div里面写东西没用,‘’内容里的写标签它也不识别

v-html向指定节点中渲染包含html结构的内容。

 data:{
            name:'尚硅谷',
            str:'<h3>hhh</h3>'
        },

与插值语法的区别:
(1)v-html会替换掉节点中所有的内容,{{xx}}则不会,这点和v-text一样。
(2)v-html可以识别html结构,这点和v-text区别,v-text不能渲染标签。

严重注意:v-html有安全性问题!!!!
(1)在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
(2)一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!

v-cloak(没有值):不让未经解析的模版跑到页面上去

script链接的js如果延迟五秒的话,body内的内容就不会展示在界面上,vue也不会工作

如果script链接的js写在body里面的最下方,那么body上面的内容会出现在页面上但是不被解析

(1)本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
(2)使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题,先隐藏标签,然后Vue渲染完了之后删除v-cloak,那么就能显示渲染完之后的页面了。

<style>
    [v-colak]{
        /* 选中所有标签属性里面有v-colak的 */
        display: none;
    }
</style>

<body>
   
   <div id="root">
       <div v-cloak>{{name}}</div>
   </div>

    <script type="text/javascript">
    const vm=new Vue({
        el:'#root',
        data:{
            name:'尚硅谷',
          
        },
  
    })

v-once指令:(没有值)

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

<div id="root">
       <div v-once>{{n}}</div>
       <button @click="n++">点我n+1</button>
       <div>{{n}}</div>
   </div>

v-pre指令:(没有值)

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

也就是程序员写的什么样它就呈现出来什么样,vue不去解析了

2.自定义指令

(1)函数式

big函数何时调用?
1、指令与元素成功绑定时(一上来,没放入页面之前)
2、指令所在的模板被重新解析时

点击按钮使n++,输出n*10

<div id="root">
       <h2>当前的n值是:
           <span v-text="n"></span>
       </h2>
       <h2>放大10倍的n值是:
           <span v-big="n"></span>
       </h2>
       <button @click="n++">点我n++</button>
   </div>

    <script type="text/javascript">
    const vm=new Vue({
        el:'#root',
        data:{
            n:1,
          
        },
        directives:{
            big(element,binding){//这里就不加v-了
                // 这里的binding是说v-big和span的绑定关系,不是v-bind
                // return this.n*10这么写不对!!
                // 不是靠返回值,是靠big这个函数返回的参数
              console.log(element,binding)
                // 第一个参数是说跟什么标签绑定的span(真实dom)
                // 第二个参数是一个存着指令值的对象
              element.innerText=binding.value*10
            }
        }

(2)对象式

配置对象中常用的3个回调:
bind:指令与元素成功绑定时(一上来,没放入页面之前)
inserted:指令所在元素被插入页面时调用(放入页面后)
update:指令所在模板结构被重新解析时调用(有任意data中的东西被改了)。

案例:定义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。

 <div id="root">
       <h2>当前的n值是:
           <span v-text="n"></span>
       </h2>
       <h2>放大10倍的n值是:
           <span v-big="n"></span>
       </h2>
       <button @click="n++">点我n++</button>
    </br>
    <input type="text" v-fbind:value="n">
   </div>
const vm=new Vue({
        el:'#root',
        data:{
            n:1,
          
        },
        directives:{
            // 函数调用的时候:一上来;指令所在模版被重新解析
            big(element,binding){//这里就不加v-了
                // 这里的binding是说v-big和span的绑定关系,不是v-bind
                // return this.n*10这么写不对!!
                // 不是靠返回值,是靠big这个函数返回的参数
                console.log(element,binding)
                // 第一个参数是说跟什么标签绑定的span(真实dom)
                // 第二个参数是一个存着指令值的对象
                element.innerText=binding.value*10
            },
            // fbind(element,binding){
            //     element.value=binding.value
            //     element.focus()
//这个放在这里刷新之后并没有自动获取焦点,所以不能写成函数得弄成对象,因为:
//fbind第一次调用就在他俩成功绑定也就是一上来的时候,那会input还没被解析到页面上,所以出不来焦点
//如果这时候点了button发现input自动获取焦点了,因为n值改变fbind再次被调用了,这时候input框已经出来了
            // }    
            fbind:{
                //指令与元素成功绑定时(一上来)
                bind(element,binding){
                    element.value=binding.value
                },
                //指令所在元素被插入到页面时调用
                inserted(element,binding){
                    element.focus()
                },
                //指令所在的模版被重新调用时
                update(element,binding){
                    element.value=binding.value
                }
                // bind和updata往往都一样,所以人家设置了函数
            }   
         }
    })
    </script>

(3)注意点

1.多个单词用-分割,v-big-number,而且在vue中写函数的时候不能简写了,得:

'big-number'(element,binding){}

2.指令里面相关的this都是window

(4)写全局指令:

Vue.directive(指令名,配置对象) 或 Vue.directive(指令名,回调函数)
Vue.directive('fbind',{
        bind、、
        update、、、
    })

和filter一样不加s

写全局函数:

Vue.directive('big',function(element,binding){
        element.innerText=binding.value*10
    })

四、Vue的生命周期!!

1.什么是生命周期?

一个小笔记:{{}}如果返回值为undefined的话不显示在页面上
生命周期
1.又名:生命周期回调函数、生命周期函数、生命周期钩子。
2.是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。
3.生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。
4.生命周期函数中的this指向是vm 或 组件实例对象。

mounted之前有一些函数,之后有一些函数,这三种加一块就组成生命周期

2.生命周期中的8个钩子

明天继续更

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

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

相关文章

前端安全——最新:lodash原型漏洞从发现到修复全过程

人生的精彩就在于你永远不知道惊喜和意外谁先来&#xff0c;又是一个平平无奇的早晨&#xff0c;我收到了一份意外的惊喜——前端某项目出现lodash依赖原型污染漏洞。咋一听&#xff0c;很新奇。再仔细一看&#xff0c;呕吼&#xff0c;更加好奇了~然后就是了解和修补漏洞之旅。…

C++开发基础——类对象与构造析构

一、基础概念 类&#xff1a;用户自定义的数据类型。 对象&#xff1a;类类型的变量&#xff0c;类的实例。 类的成员&#xff1a;成员变量和成员函数。 成员变量&#xff1a;类中定义的变量。 成员函数&#xff1a;类中定义的函数。 定义类的代码样例&#xff1a; class…

带你深入了解数据库的事务

为什么要使用事务 日常开发中&#xff0c;很多操作&#xff0c;不是通过一个SQL就能完成的&#xff0c;往往需要多个SQL配合完成 当执行多个SQL操作的时候&#xff0c;如果中间出现了特殊的情况&#xff08;程序崩溃&#xff0c;系统奔溃&#xff0c;网络断开&#xff0c;主机…

大数据任务调度平台选型建议

一 背景 数仓建设过程中&#xff0c;随着业务发展&#xff0c; ETL 任务调度越来越多&#xff0c;并且这些任务的形态多种多样。怎么样让大量的 ETL 任务准确的完成调度而不出现问题&#xff0c;甚至在任务调度执行中出现错误的情况下&#xff0c;任务能够完成自我恢复甚至执行…

分治法排序:原理与C语言实现

分治法排序&#xff1a;原理与C语言实现 一、分治法与归并排序概述二、归并排序的C语言实现三、归并排序的性能分析四、归并排序的优化 在计算机科学中&#xff0c;分治法是一种解决问题的策略&#xff0c;它将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问…

前后端分离项目部署服务器教程--实践成功

文章目录 项目介绍流程1租界云服务2通过远程软件连接服务器3部署前后端代码停止功能文件 环境配置1.安装jdk2.安装Nginx3.安装mysql数据库 花了将近一天部署前后端的项目&#xff0c;写一个日志记录一下&#xff0c;话说孰能生巧。明天把服务器恢复初始在部署一下。 项目介绍 …

【Node.js从基础到高级运用】十四、Node.js 错误处理与日志记录

引言 在这篇博客文章中&#xff0c;我们将深入探讨Node.js中的错误处理和日志记录的最佳实践。我们会了解如何在Node.js应用程序中有效地捕获和处理错误&#xff0c;并利用日志库如morgan来记录应用程序的活动和错误信息。 第1部分&#xff1a;Node.js中的错误处理 同步代码中…

【Node.js从基础到高级运用】十三、NodeJS中间件高级应用

在现代web开发中&#xff0c;Node.js因其高效和灵活性而备受青睐。其中&#xff0c;中间件的概念是构建高效Node.js应用的关键。在这篇博客文章中&#xff0c;我们将深入探讨Node.js中间件的高级应用&#xff0c;包括创建自定义中间件、使用第三方中间件等。我们将从基础讲起&a…

CTF题型 Http请求走私总结Burp靶场例题

CTF题型 Http请求走私总结&靶场例题 文章目录 CTF题型 Http请求走私总结&靶场例题HTTP请求走私HTTP请求走私漏洞原理分析为什么用前端服务器漏洞原理界定标准界定长度 重要!!!实验环境前提POST数据包结构必要结构快速判断Http请求走私类型时间延迟CL-TETE-CL 练习例题C…

三 C#插入排序算法

简介 插入排序算法是一种简单、直观的排序算法&#xff0c;其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。 插入排序实现原理 插入排序算法是一种简单、直观的排序算法&#xff0c;其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。 具体实现步骤…

Java类的初始化顺序

请直接看原文: Java类的初始化顺序_java创建顺序-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 对于静态变量、静态初始化块、变量、初始化块、构造器&#xff0c;它们的…

滴答拍摄影项目|基于Spring Boot框架+ Mysql+Java+ Tomcat的滴答拍摄影项目设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

centos创建并运行一个redis容器 并支持数据持久化

步骤 : 创建redis容器命令 docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes 进入容器 : docker exec -it mr bash 链接redis : redis-cli 查看数据 : keys * 存入一个数据 : set num 666 获取数据 : get num 退出客户端 : exit 再退…

elk收集k8s微服务日志

一、前言 使用filebeat自动发现收集k8s的pod日志&#xff0c;这里分别收集前端的nginx日志&#xff0c;还有后端的服务java日志&#xff0c;所有格式都是用json格式&#xff0c;建议还是需要让开发人员去输出java的日志为json&#xff0c;logstash分割java日志为json格式&#…

java实现word转pdf

引入依赖包 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.5.RELEASE</version></dependency><dependency><groupId…

jQuery+CSS3自动轮播焦点图特效源码

jQueryCSS3自动轮播焦点图特效源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 下载地址 jQueryCSS3自动轮播焦点图特效源码

day03vue学习

day03 一、今日目标 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.综合案例-小黑记账清单 列表渲染添加/删除饼图渲染 3.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 4.综合案例-小兔仙首页 拆分模块-局部注册结构样式完善…

LeetCode链表hard 有思路?但写不出来?

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值…

功能齐全的免费 IDE Visual Studio 2022 社区版

面向学生、开放源代码和单个开发人员的功能齐全的免费 IDE 下载地址 Visual Studio 2022 社区版 - 下载最新的免费版本 Visual Studio 2022 Community Edition – Download Latest Free Version 准备安装 选择需要安装的程序 安装进行中 使用C学习程序设计相关知识并培养编程…

改变input placeholder的样式 (适用于vue uniapp 中的input textarea)

如下控制 <textarea name"" placeholder"请输入您要反馈的问题&#xff0c;以便我们为您解决" placeholder-style"font-weight: 500;font-size: 27rpx;color: #999999;" id"" cols"30" rows"10"></text…