vue3知识点:readonly 与 shallowReadonly

news/2024/7/10 2:06:03 标签: vue.js, vue, vue3, readonly, shallowReadonly

在这里插入图片描述

文章目录

  • 三、其它 Composition API(不常用,了解即可)
  • 本人其他相关文章链接

三、其它 Composition API(不常用,了解即可)

readonly__shallowReadonly_3">2.readonlyshallowReadonly

在这里插入图片描述
注意点1:
如果使用readonly包裹的person对象的所有属性数据都只读不可需改,即name、age、salary都只读无法修改。
如果使用shallowReadonly包裹的person对象的所有属性数据,其中浅层次的设为只读,即name、age只读无法修改,但是salary可读可修改,因为salary是深层次的,不受管控。
在这里插入图片描述

注意点2:
针对注意点1,使用readonlyshallowReadonly函数修饰后哪怕你修改属性了,控制台也会报错拦截,如图
在这里插入图片描述
注意点3:

问题:既然定义了person响应式数据,那就希望被修改,但你readonlyshallowReadonly函数又不希望被修改,总感觉这两函数是不是很多余,很奇怪,啥场景才使用它?

答案:万一这个person的数据是别的组件定义传给你的,别的组件传给你只希望你使用不希望你修改的情况下,你怕自己组件内业务逻辑可能会修改它,所以用readonlyshallowReadonly函数去修饰,然后用readonly(person)包裹后新生成的person对象就可以达到效果了,哪怕你修改新生成person对象属性,也不会影响原有的person对象的属性。

测试案例

完整代码

项目目录

在这里插入图片描述

main.js

//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数
import { createApp } from 'vue'
import App from './App.vue'

//创建应用实例对象——app(类似于之前Vue2中的vm,但app比vm更“轻”)
const app = createApp(App)

//挂载
app.mount('#app')

App.vue

<template>
	<button @click="isShowDemo = !isShowDemo">切换隐藏/显示</button>
	<Demo v-if="isShowDemo"/>
</template>

<script>
	import {ref} from 'vue'
	import Demo from './components/Demo'
	export default {
		name: 'App',
		components:{Demo},
		setup() {
			let isShowDemo = ref(true)
			return {isShowDemo}
		}
	}
</script>

Demo.vue

<template>
	<h4>当前求和为:{{sum}}</h4>
	<button @click="sum++">点我++</button>
	<hr>
	<h2>姓名:{{name}}</h2>
	<h2>年龄:{{age}}</h2>
	<h2>薪资:{{job.j1.salary}}K</h2>
	<button @click="name+='~'">修改姓名</button>
	<button @click="age++">增长年龄</button>
	<button @click="job.j1.salary++">涨薪</button>
</template>

<script>
	import {ref,reactive,toRefs,readonly,shallowReadonly} from 'vue'
	export default {
		name: 'Demo',
		setup(){
			//数据
			let sum = ref(0)
			let person = reactive({
				name:'张三',
				age:18,
				job:{
					j1:{
						salary:20
					}
				}
			})

			person = readonly(person)
			// person = shallowReadonly(person)
			// sum = readonly(sum)
			// sum = shallowReadonly(sum)

			//返回一个对象(常用)
			return {
				sum,
				...toRefs(person)
			}
		}
	}
</script>

结果展示:

在这里插入图片描述

本人其他相关文章链接

1.《vue3第三章》其它 Composition API(不常用,了解即可),包括shallowReactive 与 shallowRef、readonlyshallowReadonly等等
2.vue3知识点:shallowReactive 与 shallowRef
3.vue3知识点:readonlyshallowReadonly
4.vue3知识点:toRaw 与 markRaw
5.vue3知识点:customRef
6.vue3知识点:provide 与 inject
7.vue3知识点:响应式数据的判断


http://www.niftyadmin.cn/n/898085.html

相关文章

vue3知识点:toRaw 与 markRaw

文章目录三、其它 Composition API(不常用&#xff0c;了解即可)3.toRaw 与 markRaw测试案例完整代码本人其他相关文章链接三、其它 Composition API(不常用&#xff0c;了解即可) 3.toRaw 与 markRaw 注意点1&#xff1a; 之前上面讲解的函数都是把普通数据 -> 响应式数据…

vue3知识点:customRef

文章目录三、其它 Composition API(不常用&#xff0c;了解即可)4.customRef测试案例完整代码本人其他相关文章链接三、其它 Composition API(不常用&#xff0c;了解即可) 4.customRef 作用&#xff1a;创建一个自定义的 ref&#xff0c;并对其依赖项跟踪和更新触发进行显式控…

vue3知识点:provide 与 inject

文章目录三、其它 Composition API(不常用&#xff0c;了解即可)5.provide 与 inject测试案例完整代码本人其他相关文章链接三、其它 Composition API(不常用&#xff0c;了解即可) 5.provide 与 inject 作用&#xff1a;实现祖与后代组件间通信套路&#xff1a;父组件有一个 …

vue3知识点:响应式数据的判断

文章目录三、其它 Composition API(不常用&#xff0c;了解即可)6.响应式数据的判断测试案例完整代码本人其他相关文章链接三、其它 Composition API(不常用&#xff0c;了解即可) 6.响应式数据的判断 测试案例 完整代码 项目目录 main.js //引入的不再是Vue构造函数了&#…

《vue3第四章》Composition API 的优势,包含Options API 存在的问题、Composition API 的优势

文章目录四、Composition API 的优势1.Options API 存在的问题2.Composition API 的优势四、Composition API 的优势 1.Options API 存在的问题 使用传统OptionsAPI中&#xff0c;新增或者修改一个需求&#xff0c;就需要分别在data&#xff0c;methods&#xff0c;computed里…

《vue3第五章》新的组件,包含:Fragment、Teleport、Suspense

文章目录五、新的组件1.Fragment2.Teleport案例完整代码3.Suspense案例完整代码本人其他相关文章链接五、新的组件 1.Fragment 在Vue2中: 组件必须有一个根标签在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中好处: 减少标签层级, 减小内存占用…

《vue3第六章》其他,包含:全局API的转移、其他改变

文章目录六、其他1.全局API的转移2.其他改变六、其他 1.全局API的转移 Vue 2.x 有许多全局 API 和配置。 例如&#xff1a;注册全局组件、注册全局指令等。 //注册全局组件 Vue.component(MyButton, {data: () > ({count: 0}),template: <button click"count"…

vue3知识点:Teleport组件

文章目录五、新的组件2.Teleport案例完整代码本人其他相关文章链接五、新的组件 2.Teleport 问题&#xff1a;什么是Teleport&#xff1f; 答案&#xff1a;Teleport 是一种能够将我们的组件html结构移动到指定位置的技术。 <teleport to"移动位置"><div …