IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue——数据更新、表单、过滤器、自定义指令相关笔记 -> 正文阅读

[JavaScript知识库]Vue——数据更新、表单、过滤器、自定义指令相关笔记

文章目录

  • 前言
  • 一、数据更新
    • 1.对象添加属性
    • 2. 数组追加属性
  • 二、Vue表单
    • 1. v-model 收集
    • 2.?v-model 修饰符
    • 3. 相关案例
  • 三、过滤器
    • 1. 局部使用过滤器
    • 2. 全局使用过滤器
  • 四、自定义指令
    • 1. 自定义局部指令
    • 2. 自定义全局指令
  • 总结


一、数据更新

案例1? ?——? 实现当点击按钮时给 persons 该对象添加一个属性 sex 属性值为男。

 <div id="root">
        <p>姓名:{{persons.name}}</p>
        <p>年龄:{{persons.age}}</p>
        <p>性别:{{persons.sex}}</p>
        <button @click="addSex">增加性别属性</button>
      
        <br>
        <br>

    </div>
    <script>
        const vm = new Vue({
            el: '#root',
            data: {
                persons: {
                    name: 'Jack',
                    age: 24
                }
            },
            methods: {
                addSex() {
                   this.persons.sex = '男';
                   console.log(this.persons);
                }
            }

        })
    </script>

运行结果:

通过以上案例我们可以看出通过以往追加属性的方式在vue中并不奏效,那么如果要追加属性时应该采用哪种方式呢?下面就通过对象和数组两种数据格式分别讲解:

1.对象添加属性2. 数组追加属性

概念:new vue的时,vue通过setter监控数据,直接给对象添加属性,vue不做响应式处理,如果要给添加的属性增加响应式处理,

例如要增添一个sex属性,直接this.persons.sex=’男’这个增加的属性是不做相应式处理的,需要按照以下方法:

1.1 追加属性:

Vue.set(target,propertyName/index,value) ??? ??? ??? ??? ???

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

参数一: 将要追加属性的对象名 /? 数组名

参数二: 将要追加的属性名??/? 索引值

参数三: 将要追加的属性值

1.2 删除属性:

Vue.delete(target,propertyName/index,value)

参数一: 将要删除属性的对象名??

参数二: 将要删除的属性名

1.3 或者采取重新赋值的方式:

Reflect.deleteProperty(target, propertyName);? ?——// 删除对象中的一个属性

参数一: 将要删除属性的对象名??

参数二: 将要删除的属性名

this.person = { … this.person}? —— 结构赋值

实现案例1相关代码

 <div id="root">
        <p>姓名:{{persons.name}}</p>
        <p>年龄:{{persons.age}}</p>
        <p>性别:{{persons.sex}}</p>
        <button @click="addSex">增加性别属性</button>
        <button @click="delAge">删除年龄属性</button>
        <br>
        <br>
        <button @click="addSex1">增加性别属性方法一</button>
        <button @click="delAge1">删除年龄属性方法二</button>
        <br>
        <br>

    </div>
    <script>
        const vm = new Vue({
            el: '#root',
            data: {
                persons: {
                    name: 'Jack',
                    age: 24
                }
            },
            methods: {
                addSex() {
                    // Vue.set(this.persons, 'sex', '男');
                    // console.log(123);
                },
                delAge() {
                    Vue.delete(this.persons, 'sex')
                },
                addSex1() {
                    this.persons.sex ='男';
                    this.persons = {...this.persons}
                },
                delAge1() {
                    Reflect.deleteProperty(this.persons, 'sex');
                    this.persons = {... this.persons};
                }
            }

        })
    </script>

2. 数组追加属性

通过数组,??调用原生对应的方法(对原数组有改变的相关api)对数组进行更新??,从而进行页面的更新。

原生的方法1:API:push()、pop()、shift()、unshift()、splice()、sort()、reverse()

数组也可以使用对象检测的方法,也可以采用重新赋值的方式

若需要使用filter方法(因为filter 方法会返回一个新的数组)此时可通过使用返回的新数组替换原本数组的方法

实现案例1相关代码(数据以数组形式存储)

   <div id="root">
        <p>姓名:{{persons[0]}}</p>
        <p>年龄:{{persons[1]}}</p>
        <p>性别:{{persons[2]}}</p>
        <button @click="addSex">增加性别属性</button>
        <button @click="delAge">删除年龄属性</button>
        <br>
        <br>
        <button @click="addSex1">增加性别属性方法一</button>
        <button @click="delAge1">删除年龄属性方法二</button>
        <br>
        <br>

    </div>
    <script>
        const vm = new Vue({
            el: '#root',
            data: {
                persons: ['name:jack','age: 24'],
            },
            methods: {
                addSex( ) {
                    Vue.set(this.persons, 2, 'sex:男');
                    console.log(123);
                },
                delAge( ) {
                    Vue.delete(this.persons, 2)
                },
                addSex1( ) {
                    this.persons[2] = '男';
                    this.persons = [ ...this.persons ]
                },
                delAge1( ) {
                   this.persons.pop( );
                }
            }
        })
    </script>

二、Vue表单

1. v-model 收集

可以用 v-model 指令在表单控件元素上创建双向数据绑定。v-model 会根据控件类型自动选取正确的方法来更新元素。下图就说明了v-model 进行数据绑定的一个图示,

1:type="text"????? v-model收集的值就是,input框的值;

2:type="radio"???? v-model收集的值,就是各标签的value值;

3:type="checkbox"? ——所以若要获取复选框的值,最好是采用数组的方式承接结果

· 没有设置value值时,v-model收集的就是checked的属性。

· 配置v-model值是数组,那么收集的就是value构成的数组。

· 配置v-model值是字符串,那么收集的是checked值(布尔值)

2.?v-model 修饰符

  • lazy:失去焦点再收集数据
  • number:输入字符串转为有效的数字
  • trim:输入首尾空格过滤

3. 相关案例

如图是一个表单,要求当点击‘提交数据按钮’时,将表单中的各输入框中的值收集。

像这样的案例在许多的页面中都有应用,那么在vue框架中如何是实现呢?

    <div id="root">
        <form @submit.prevent="save">
            姓名:<input type="text" value="" v-model="userinfo.realname" /><br /><br />
            年龄:<input type="number" value="" v-model.number="userinfo.age" /><br /><br />

            <!-- 使用name属性标识以下input框属于同一组数据 -->
            性别:<input type="radio" name="sex" value="1" v-model="userinfo.sex" /> 男 
            <input name="sex" type="radio" value="2" v-model="userinfo.sex" /> 女<br /><br />
            爱好:<input type="checkbox" name="hobby" value="1" v-model="userinfo.hobby" /> 玩游戏
            <input type="checkbox" name="hobby" value="2" v-model="userinfo.hobby" /> 跳舞
            <input type="checkbox" name="hobby" value="3" v-model="userinfo.hobby" /> 跑步<br /><br />
            城市:
            <select name="city" v-model.number="userinfo.city">
                <option value="0">请选择数据</option>
                <option value="1">合肥</option>
                <option value="2">芜湖</option>
                <option value="3">六安</option>
            </select><br /><br />
            介绍:<textarea v-model.lazy="userinfo.desc"></textarea>
            <br>
            <br>
            <input type="submit" value="提交数据"/>
        </form>
    </div>

    <!-- 收获表单数据vue部分 -->
    <script>
        Vue.config.productionTip = false;
        new Vue({
				el:"#root",
				data:{
					userinfo:{
						realname:'',
						age:'',
						sex:1,
						hobby:[],
						city:0,
						desc:''
					}
					
				},
				methods: {
					save() {
					   console.log(JSON.stringify(this.userinfo));
					}
				}
        })
    </script>

三、 过滤器

对要显示的数据进行特定格式化后再显示。

1. 局部使用过滤器2. 全局使用过滤器?

当前vm使用:

new Vue{

? ? ?filters:{? ? ?———此处注册为局部过滤器

//相关逻辑代码

? ? ? }

}

页面使用方式:

?{{ 参数一?|? 参数二)}}

参数一: 被格式化的变量

参数二: 过滤器的名字

案例? —— 将? data 中 str 的属性值进行大小写转换

   <!-- 进行大小写转化 -->
    <div id="root">
        <p>转换前的字符串: {{str}}</p>
        <p>首字母转小写: {{str | change}}</p>
        <p>转换前的字符串: {{str1}}</p>
        <p>首字母转小写: {{str1 | change(2)}}</p>
    </div> 
<script>     
   const vm = new Vue({
            el: '#root',
            data: {
                str: 'daylight',
                str1:'Daylight',
                str2:'Taylor'
            },
            // 局部过滤器
            filters: {
                // 这里的 value 就是在页面中使用的模板字符 str
                change(value, flag = 1) {
                    if (flag == 1) {
                        return value.slice(0,1).toUpperCase( )+value.slice(1);
                    } else {
                        return value.slice(0,1).toLowerCase( )+value.slice(1);
                    }
                }
            }
        })
    </script>

运行结果

2. 全局使用过滤器?

全局vm使用:

Vue.filter(name,callback)

参数一: 过滤器的名字

参数二: 回调函数

<div id="root">
        <p>首字母转小写: {{str2 | changes}}</p>
    </div>
<script>
          // 全局过滤器
          Vue.filter('changes',function(value){
           return value.slice(0,1).toLowerCase()+value.slice(1);
        })
        const vm = new Vue({
            el: '#root',
            data: {
                str: 'daylight',
                str1:'Daylight',
                str2:'Taylor'
            }
        })
    </script>

运行结果

四、自定义指令?

除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。

1. 自定义局部指令

new Vue({

?directives:{指令名:配置对象}?

或? directives{指令名:回调函数} })

})

函数调用:?

directives:{

??? ??? //指令与元素绑定时候调用,模板解析时调用(模板更新)

??? ??? big(element,item){

??? ??? ??? // console.log('big',this) //注意此处的this是window

??? ??? ??? element.innerText = item.value*10;? ———使得当前元素的文本值变大十倍

??? ??? },

}

element??——? ?当前绑定指令的节点html结构,例如当前为 <div></div>

value? ? ? ——? ?关于当前自定义指令的相关属性描述,包括指令名称,指令所包括的值

内置对象

? ? ? ? ? ? ? ? ? bind? ——//指令与元素成功绑定时(一上来)

??? ??? ??? ??? ??? bind(element,binding){

??? ??? ??? ??? ??? ??? element.value = binding.value

??? ??? ??? ??? ??? },

? ? ? ? ? ? ? ? ? ?insert ——??//指令所在元素被插入页面时

??? ??? ??? ??? ??? inserted(element,binding){

??? ??? ??? ??? ??? ??? element.focus()

??? ??? ??? ??? ??? },

? ? ? ? ? ? ? ? ? update —— //指令所在的模板被重新解析时

??? ??? ??? ??? ??? update(element,binding){

??? ??? ??? ??? ??? ??? element.value = binding.value

??? ??? ??? ??? ??? }

2. 自定义全局指令

Vue.directive('fbind',{

??? ??? //指令与元素成功绑定时(一上来)

??? ??? bind(element,binding){

??? ??? ??? ??? element.value = binding.value

??? ??? },

??? ??? //指令所在元素被插入页面时

??? ??? inserted(element,binding){

??? ??? ??? ??? element.focus()

??? ??? },

??? ??? //指令所在的模板被重新解析时

??? ??? update(element,binding){

??? ??? ??? ??? element.value = binding.value

??? ??? }

})

3. 相关案例

自定义一个指令,实现点击按钮时赋值文本框中的值

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../../vue.js"></script>
	</head>
	<body>
		<!-- 思路: 1)绑定的时候,设置一个全局变量进行接收要复制的值 -->
		<!-- 2)创建一个函数(用来监听点击事件),创建一个空的值,然后把el.value复制给创建的空值,然后默认全选,点击copy就可以进行copy -->
		<!-- 3)指令与元素解绑的时候,去除这个监听事件 -->



		<div id="app">
			<textarea v-model="str"></textarea>
			<button v-mycopy="str">一键复制</button>
			<!-- 这个复制的只是textarea里面的内容 -->
		</div>


		<script>
			new Vue({
				el: "#app",
				data: {
					str: " ",
				},
				directives: {
					mycopy: {
						// 指令绑定时候(一上来绑定数据的时刻)
						bind(el, {value}) {
							// ele.$value = value;
						// $是在vue中所有实例中都可用的一个简单约定,这样做会避免和已被定义的数据,方法,计算属性产生冲突。
							el.price = value //设置全局要copy的值
							el.handle = () => {
								if (!el.price) {
									alert("请输入内容copy")
									return
								}
								
								// 设置一个临时文本,用来存储里面的数据
								const textarea = document.createElement("textarea");
								
								// const  textarea = document.querySelector("textarea")
								// 如果只是对原文框进行操作的话,copy完成之后,就会将这个文本框进行移除,就无法实现后续再次输入的效果
								// 所以要创建一个文本框,将要copy的值放在添加的文本框当中,对这个文本框进行操作
								
								//设置里面的属性是一个只读的属性
								textarea.readOnly = "readonly";
								textarea.value = el.price;
								textarea.style.position = "absolute";
								document.body.appendChild(textarea);


								//选中textarea 里面的值
								textarea.select(); //对里面的值进行一个全选的操作
								textarea.setSelectionRange(0, textarea.value.length)
								//移动端,对里面的内容进行一个 copy

								//设置copy
								// execCommand方法是执行一个对当前文档,当前选择或者给出范围的命令。
								const res = document.execCommand("copy");
								if (res) {
									alert("copy成功")
								}
								document.body.removeChild(textarea);
							}

							el.addEventListener("click", el.handle);

						},
						// update 里面的数据发生更新的时候进行操作
						update(el, {value}) {
							el.price = value //设置全局要copy的值
						}

					}
				}
			})
		</script>
	</body>
</html>

相关代码解释:

?element.$value = value;? -——?// 为 element增添全局属性,以便于承载后面要复制的内容,$value 并没有其他的含义,只是为了和后面的value 以示区别

textarea.readOnly = 'readOnly';? ——将文本域的值设为只读状态

?textarea.select( );? ? ? ? ? ——选中文本域中的值

?textarea.setSelectionRange(0,textarea.value.length);? ?——为了兼容移动端,选中文本域中的值

? ?document.execCommand('copy');? ——JS中的复制功能

总结

今日分型到此结束,”纸上得来终觉浅,绝知此事要躬行。“ 掌握了理论知识的同时,也要记得多动手写一写,免得”眼睛会了手不会“ 。

好了,废话不多说,最后依旧祝福屏幕前的你健康幸福、平安喜乐!

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:43:36  更:2022-09-30 00:47:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 15:33:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码