vue知识点(2)

news/2025/3/11 15:34:24/

表单输入绑定

表单输入绑定是通过 v-model 指令实现的。可以用于各种表单元素,如 <input><textarea><select> 等。

文本输入框

<template><input v-model="text" placeholder="请输入文本" /><div>{{ text }}</div>
</template><script setup>
import { ref } from 'vue'
const text = ref('')
</script>

多行文本输入框

<template><textarea v-model="text" placeholder="请输入多行文本" ></textarea><div>{{ text }}</div>
</template><script setup>
import { ref } from 'vue'
const text = ref('')
</script>

复选框

单个复选框绑定布尔值

<template><input type="checkbox" v-model="isChecked" /><label>是否同意:{{ isChecked }}</label>
</template><script setup>
import { ref } from 'vue'
const isChecked = ref(false)
</script>

多个复选框绑定数组

<template><input type="checkbox" v-model="selectedFruits" value="苹果" /><label>苹果</label><input type="checkbox" v-model="selectedFruits" value="香蕉" /><label>香蕉</label><input type="checkbox" v-model="selectedFruits" value="橙子" /><label>橙子</label><div><p>你选中的水果是:{{ selectedFruits }}</p></div>
</template><script setup>
import { ref } from 'vue'
const selectedFruits = ref([])
</script>

单选框

<template><input type="radio" v-model="selectedFruit" value="苹果" /><label>苹果</label><input type="radio" v-model="selectedFruit" value="香蕉" /><label>香蕉</label><input type="radio" v-model="selectedFruit" value="橙子" /><label>橙子</label><div><p>你选中的水果是:{{ selectedFruit }}</p></div>
</template><script setup>
import { ref } from 'vue'
const selectedFruit = ref('')
</script>

下拉选择框

单选

<template><select v-model="selectedFruit"><option value="苹果">苹果</option><option value="香蕉">香蕉</option><option value="橙子">橙子</option></select><div><p>你选中的水果是:{{ selectedFruit }}</p></div>
</template><script setup>
import { ref } from 'vue'
const selectedFruit = ref('')
</script>

多选

<template>//multiple启用多选功能,按住 Ctrl 或 Command 键点击选项即可多选。<select v-model="selectedFruits" multiple><option value="苹果">苹果</option><option value="香蕉">香蕉</option><option value="橙子">橙子</option></select><p>你选中的水果是:{{ selectedFruits }}</p>
</template><script setup>
import { ref } from 'vue'
const selectedFruits = ref([])
</script>

修饰符

Vue 为 v-model 提供了一些修饰符,用于控制数据的更新行为。
.lazy
默认情况下,v-model 会在 input 事件触发时同步数据。使用 .lazy 修饰符后,数据会在 change 事件触发时同步(通常在输入框失去焦点时)。

//在 "change" 事件后同步更新而不是 "input"
<input v-model.lazy="message" placeholder="请输入内容">

.number
将用户输入的值自动转换为数字类型。

//number 修饰符会在输入框有 type="number" 时自动启用
<input v-model.number="age" type="number" placeholder="请输入年龄">

.trim
自动去除用户输入内容的首尾空白字符。

<input v-model.trim="message" placeholder="请输入内容">

自定义组件的 v-model

//自定义输入组件
<template><div><CustomInput v-model="message"></CustomInput><p>输入的内容是:{{ message }}</p></div>
</template><script setup>
import CustomInput from '../components/CustomInput.vue'
import { ref } from 'vue'const message = ref('')
</script>
//在 CustomInput.vue 中
<template><input:value="modelValue"//事件监听器,用于监听输入框的输入事件。通过 $emit 方法向上级组件发送一个名为 update:modelValue 的自定义事件,并将输入框当前的值 ($event.target.value) 作为参数传递出去。@input="$emit('update:modelValue', $event.target.value)"placeholder="请输入内容"/>
</template><script setup>
//用于定义组件接收的属性。
defineProps(['modelValue'])
//用于定义组件可以触发的自定义事件。
defineEmits(['update:modelValue'])
</script>

侦听器

用于监听数据变化并执行特定的逻辑。使用 watch 函数监听一个特定的数据属性,并在该属性发生变化时执行回调函数。

<template><div><input v-model="message" placeholder="请输入内容" /><p>新值:{{ updatedMessage }}</p><p>旧值:{{ oldMessage }}</p></div>
</template><script setup>
import { ref, watch } from 'vue'const message = ref('')
const updatedMessage = ref('')
const oldMessage = ref('')
//用于监听 message 数据的变化,当 message 数据发生变化时,会触发回调函数。
watch(message, (newVal, oldVal) => {updatedMessage.value = newValoldMessage.value = oldVal
})
</script>

watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组。

<template><div><button @click="handleClick">点击++</button></div>
</template><script setup>
import { ref, watch } from 'vue'const x = ref(0)
const y = ref(0)const handleClick = () => {x.value++y.value++
}// 单个 ref
watch(x, (newX) => {console.log(`x is ${newX}`)
})// getter 函数
watch(() => x.value + y.value,(sum) => {console.log(`sum of x + y is: ${sum}`)}
)// 多个来源组成的数组
watch([x, () => y.value], ([newX, newY]) => {console.log(`x is ${newX} and y is ${newY}`)
})
</script>

但是,不能直接侦听响应式对象的属性值

const obj = reactive({ count: 0 })// 错误,因为 watch() 得到的参数是一个 number
watch(obj.count, (count) => {console.log(`Count is: ${count}`)
})

应该用一个返回该属性的 getter 函数

// 提供一个 getter 函数
watch(() => obj.count,(count) => {console.log(`Count is: ${count}`)}
)

深层侦听器

直接给 watch() 传入一个响应式对象,会隐式地创建一个深层侦听器——该回调函数在所有嵌套的变更时都会被触发。

<template><div><button @click="handleClick">点击++</button></div>
</template><script setup>
import { ref, watch, reactive } from 'vue'const obj = reactive({ count: 0, name: '张三' })const handleClick = () => {obj.count++
}watch(obj, (newValue, oldValue) => {// 在嵌套的属性变更时触发// 注意:`newValue` 此处和 `oldValue` 是相等的// 因为它们是同一个对象!console.log(newValue, oldValue)
})
</script>

显式地加上 deep 选项,强制转成深层侦听器

<template><div><button @click="handleClick">点击</button></div>
</template><script setup>
import { ref, watch, reactive } from 'vue'const state = reactive({someObject: {count: 0,name: '张三',info: {address: '张家口',},},
})const handleClick = () => {// 如果整个对象被替换,`newValue` 和 `oldValue` 是不相等的state.someObject = {count: 1,name: '王五',}// 如果只修改对象的属性,`newValue` 此处和 `oldValue` 是相等的// 只有加上 `deep: true` 才会改变 address 的值state.someObject.info = {address: '王家口',}
}watch(() => state.someObject,(newValue, oldValue) => {// 注意:`newValue` 此处和 `oldValue` 是相等的// *除非* state.someObject 被整个替换了,`newValue` 和 `oldValue` 才会不相等console.log(newValue, oldValue)},{ deep: true }
)
</script>

即时回调的侦听器

默认情况下,侦听器只有在监听的数据发生变化时才会触发。如果希望侦听器在初始化时立即执行一次,可以使用 immediate 选项。

<template><div><button @click="handleClick">点击</button></div>
</template><script setup>
import { ref, watch, reactive } from 'vue'const source = ref(0)const handleClick = () => {source.value++
}watch(source,(newValue, oldValue) => {// 立即执行,且当 `source` 改变时再次执行console.log(newValue, oldValue)if (newValue === 1) {source.value = 0}},{ immediate: true }
)
</script>

watchEffect

用于自动追踪依赖并执行副作用的函数。它类似于 watch,但更加简洁,适合用于不需要显式指定监听数据,而是自动追踪回调函数中使用的响应式数据的场景。
在回调函数中自动追踪所有使用的响应式数据。当这些数据发生变化时,回调函数会重新执行。

<template><div><button @click="handleClick">点击</button></div>
</template><script setup>
import { ref, watchEffect } from 'vue'const source = ref(0)const handleClick = () => {source.value++
}watchEffect(() => {console.log(source.value)
})
</script>

停止侦听器

同步语句创建的侦听器,会自动绑定到宿主组件实例上,并且会在宿主组件卸载时自动停止。
如果用异步回调创建一个侦听器,那么它不会绑定到当前组件上,你必须手动停止它,以防内存泄漏。

<template><div><button @click="handleClick">点击</button></div>
</template><script setup>
import { ref, watchEffect } from 'vue'const source = ref(0)const handleClick = () => {source.value++
}let stop = nullstop = watchEffect(() => {console.log(source.value)if (source.value === 5) {stop()console.log('侦听已停止')}
})// 5 秒后停止侦听
setTimeout(() => {stop()console.log('侦听已停止')
}, 5000)
</script>

http://www.ppmy.cn/news/1578385.html

相关文章

Android操作CAN总线(基于linux-canutils库,发送、接收、设置过滤器)

文章目录 一、前言二、前言2三、前置知识3.1 epoll3.2 jni 四、具体实现4.1 aar设计4.2 部分代码解读 五、应用层调用示例1. 打开CAN口和接收功能2. 发送CAN帧3. 关闭CAN口 六、参考文档七、附录 一、前言 CAN总线&#xff08;Controller Area Network Bus&#xff09;控制器局…

Reactor中的Flux和Mono的区别

Reactor中的Flux和Mono的区别 在Reactor框架中&#xff0c;Flux 和 Mono 是两个核心的类型&#xff0c;分别用于处理不同的数据流场景。理解它们之间的区别是掌握响应式编程的关键。 1. 基本概念 Flux: 表示一个异步、非阻塞的流&#xff0c;能够发布零个或多个元素。它适用于…

BUUCTF [GUET-CTF2019]soul sipse 1

BUUCTF:https://buuoj.cn/challenges 文章目录 题目描述&#xff1a;密文&#xff1a;解题思路&#xff1a;flag&#xff1a; 相关阅读 CTF Wiki CTF 隐写工具Steghide BUUCTF&#xff1a;[GUET-CTF2019]soul sipse 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 密…

软件工程:软件开发之需求分析

物有本末&#xff0c;事有终始。知所先后&#xff0c;则近道矣。对软件开发而言&#xff0c;软件需求乃重中之重。必先之事重千钧&#xff0c;不可或缺如日辰。 汽车行业由于有方法论和各种标准约束&#xff0c;对软件开发有严苛的要求。ASPICE指导如何审核软件开发&#xff0…

Android Glide 的显示与回调模块原理源码级深度剖析

一、引言 在当今的 Android 应用开发中&#xff0c;图片处理是一个至关重要的环节。从应用的图标展示到复杂的图片画廊&#xff0c;图片的加载和显示直接影响着用户体验。Glide 作为一款功能强大且广泛使用的图片加载库&#xff0c;凭借其高效的性能、丰富的功能和简洁的 API&…

(每日一题) 力扣 14 最长公共前缀

14. 最长公共前缀题解&#xff1a;多方法详解与C实现 问题描述 给定字符串数组&#xff0c;找出所有字符串的最长公共前缀。若不存在则返回空字符串。 示例&#xff1a; 输入&#xff1a;["flower","flow","flight"] 输出&#xff1a;"…

NS3学习——运行自定义拥塞控制算法步骤

目录 一、添加优化后的代码文件 二、更改CMakeLists文件中内容 三、重新配置和编译ns-3 四、常见问题 目的&#xff1a;想在tcp拥塞控制算法的基础上进行优化改进&#xff0c;之后在ns3中运行优化后的算法&#xff0c;即自定义拥塞控制算法&#xff1b; 以tcpVegas算法为…

Java 集合框架大师课:性能调优火葬场(四)

&#x1f680; Java 集合框架大师课&#xff1a;性能调优火葬场&#xff08;四&#xff09; &#x1f525; 战力值突破 95% 警告&#xff01;调优就像吃重庆火锅——要选对食材&#xff08;数据结构&#xff09;还要控制火候&#xff08;算法&#xff09;&#x1f336;️ 第一章…