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

news2024/10/6 18:27:51

一、收集表单数据

爱好:
         学习<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个钩子

明天继续更

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

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

相关文章

创建局域网分享图片及html页面服务(简单讲下)

目录 1. 使用Python的SimpleHTTPServer&#xff08;适用于Windows&#xff09; 打开其中的.html文件&#xff1a; 打开其中的.png文件&#xff1a; 推荐第2种&#xff1a; 2. 使用Node.js和http-server&#xff08;适用于所有平台&#xff09; 安装http-server&#xff08;…

PSCA复位控制集成之复位信号

组件可能支持两种基本的复位类型。 • 冷复位&#xff1a;重置组件中的所有逻辑。用作上电复位。 • 热复位&#xff1a;重置组件中的大部分逻辑。通常&#xff0c;复位的范围是所有功能逻辑。不包括在热复位中的逻辑会随组件类型而变化&#xff0c;但通常会排除诸如调试和 R…

【论文阅读】Scalable Diffusion Models with Transformers

DiT&#xff1a;基于transformer架构的扩散模型。 paper&#xff1a;[2212.09748] Scalable Diffusion Models with Transformers (arxiv.org) code&#xff1a;facebookresearch/DiT: Official PyTorch Implementation of "Scalable Diffusion Models with Transformer…

13 秒插入 30 万条数据,这才是 Java 批量插入正确的姿势!

本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证 实体类、mapper和配置文件定义 User实体 mapper接口 mapper.xml文件 jdbc.properties sqlMapConfig.xml 不分批次直接梭哈 循环逐条插入 MyBatis实现插入30万条数据 J…

python 深度学习 记录遇到的报错问题12

本篇继python 深度学习 记录遇到的报错问题11_undefined symbol: __nvjitlinkadddata_12_1, version-CSDN博客 目录 一、AttributeError: module ‘tensorflow‘ has no attribute ‘app‘ 二、AttributeError: module tensorflow has no attribute placeholder 三、Attribu…

基于51单片机火灾报警器设计

一、系统方案 1、本设计采用51单片机作为主控器。 2、液晶1602显示。 3、采集温度值&#xff0c;烟雾值。 4、按键设置温度、烟雾报警值&#xff0c;测量值超过设置值蜂鸣器报警。 5、按键布防&#xff0c;有人闯入&#xff0c;声光报警。 二、硬件设计 原理图如下&#xff1a…

牛客DP34 前缀和

解题思路 题目解析如图 思路 算出每个位置的到第一个位置的总和 比如 第一个位置 1 总和 1 第二个位置 2 总和 3 第三个位置 4 总和 7 要算 2到3 位置的前缀和 用3位置的总和减去1位置的总和即可 还要处理一个边界情况 如果1到1位置的前缀和那么就是 …

【React】Vite创建React+TS项目

前提条件 有node环境&#xff0c;且node版本>18.0.0 创建项目 npm create vitelatest1.起项目名 2.选择框架 3.选择语言 TypeScript SWC 是指 Vite 使用 SWC&#xff08;Speedy Web Compiler&#xff09;作为 TypeScript 的编译器。 SWC 是一个针对 JavaScript 和 Ty…

HarmonyOS NEXT应用开发之SideBarContainer侧边栏淡入淡出动效实现案例

介绍 在2in1或平板上&#xff0c;群聊侧边栏是一种较为常用的功能&#xff0c;虽然HarmonyOS已经具备了基本的动效&#xff0c;但是部分情况下开发者可能有定制侧边栏动效的需求&#xff0c;本例主要介绍了如何基于显式动画实现侧边栏的淡入淡出动效。 效果图预览 使用说明&a…

力扣模板题:检测字符串中数字是否递增

bool areNumbersAscending(char * s){//双指针操作&#xff0c;前指针保存前面一个数字字符int p0,q0;for(int i0;s[i];i){if(s[i]>0&&s[i]<9){pp*10s[i]-0;if(s[i1] ||s[i1]\0){//进行比较, 比较过后将p赋值q&#xff0c;q记录前面一个数字,因为数字均为小于100…

Git 仓库瘦身与 LFS 大文件存储

熟悉 Git 的小伙伴应该都知道随着 Git 仓库维护的时间越来越久&#xff0c;追踪的文件越来越多&#xff0c;git 存储的 objects 数量会极其庞大&#xff0c;每次从远程仓库 git clone 的时候都会墨迹很久。如果我们不小心 git add 了一个体积很大的文件&#xff0c;且 git push…

通俗易懂的精度Precision和召回率Recall解释,看这篇就行,5分钟记住。

一、背景 因为我是做机器人方向的&#xff0c;不可避免的涉及到视觉方向的内容&#xff0c;还有审稿的时候也会看到识别相关的内容&#xff0c;其中衡量识别效果的指标包括精度Precision和召回率Recall&#xff0c;虽然很好理解&#xff0c;但每次都记不住&#xff0c;趁这次机…

【递归专题】【蓝桥杯备考训练】:有序分数、正则问题、带分数、约数之和、分形之城【已更新完成】

目录 1、有序分数&#xff08;usaco training 2.1&#xff09; 2、正则问题&#xff08;第八届蓝桥杯省赛C A组 & Java A组&#xff09; 3、带分数&#xff08;第四届蓝桥杯省赛Java A组/B组 & C B组/C组&#xff09; 4、约数之和&#xff08;《算法竞赛进阶指南》…

Flink实时数仓之用户埋点系统(二)

用户埋点平台-数仓建模 1、数据仓库 1.1 数据仓库的构建 1.1.1 数据模型 数据模型就是数据组织和存储方法&#xff0c;它强调从业务、数据存取和使用角度合理存储数据。只有将数据有序的组织和存储起来之后&#xff0c;数据才能得到高性能、低成本、高效率、高质量的使用。…

【ArcGISProSDK】获取扩展模块许可到期时间

结果 以下是获取的3D分析模块的许可到期时间 代码 var licenseExpirationDate ArcGIS.Core.Licensing.LicenseInformation.GetExpirationDate(LicenseCodes.Analyst3D); 扩展模块 MemberDescriptionAnalyst3D3D AnalystAviationAirportsAviation and AirportsBusinessAnal…

数目之差

解法一&#xff1a; 显然只需让多的在限度内最多即可 #include<iostream> #include<algorithm> using namespace std; #define endl \n void solve() {int n, k, num0 0, num1 0;cin >> n >> k;string s;cin >> s;for (int i 0; i < s.s…

OpenAI Q-Star:AGI距离自我意识越来越近

最近硅谷曝出一份54页的内部文件&#xff0c;揭露了去年OpenAI宫斗&#xff0c;导致Altman&#xff08;奥特曼&#xff09;差点离职的神秘项目——Q-Star&#xff08;神秘代号Q*&#xff09;。 根据该文件显示&#xff0c;Q-Star多模态大模型拥有125万亿个参数&#xff0c;比现…

linux之source.list解析

众所周知&#xff0c;linux可以通过apt命令安装软件&#xff0c;那么apt又是从哪里获取软件包呢并安装呢&#xff1f;这里就绕不开一个文件source.list&#xff0c;该文件定义了软件源相关的信息。下面以实际例子&#xff0c;详细的介绍下这个文件。 文件作用 定义软件源的信…

就业班 第二阶段 2401--3.18 初识mysql

初识&#xff1a; 1、关系型数据库mysql、mariadb、sqlite 二维关系模型 2、非关系型数据库 redis、memcached sql 四个部分 DDL 数据库定义语言 创建数据库&#xff0c;创建用户&#xff0c;创建表 DML 数据库操作语言 增删改 DQL 数据库查询语言 查 DCL 数据库控制语言 授权 …

phpstudy自定义安装mysql8.3并启动

phpstudy自定义安装mysql8.3并启动 先去官网:https://dev.mysql.com/downloads/下载压缩包文件 然后按下面的图片一步一步操作 选择版本&#xff0c;选择第一个压缩包文件&#xff0c;下载 下载完成后&#xff0c;解压到phpstudy环境目录下&#xff0c;如下图 然后进入mysq…