<template>
<h1>一个人的信息h1>
<h2>姓名:{{name}}h2>
<h2>年龄:{{age}}h2>
<button @click="changeInfo">修改人的信息button>
template>
<script>
import {ref} from 'vue'
export default {
name: 'App',
setup(){
//数据
let name=ref('张三')
let age=ref(18)
function changeInfo(){
console.log("name,age",name,age)
name.value='李四'
age.value=20
console.log(name,age)
}
//返回一个对象(常用)
return{
name,
age,
changeInfo
}
}
}
script>
<template>
<h1>一个人的信息h1>
<h2>姓名:{{name}}h2>
<h2>年龄:{{age}}h2>
<h2>工作:{{job.type}}h2>
<h2>薪资:{{job.salary}}h2>
<button @click="changeInfo">修改人的信息button>
<button @click="changeObject">修改职位信息button>
template>
<script>
import {ref} from 'vue'
export default {
name: 'App',
setup(){
//数据
let name=ref('张三')
let age=ref(18)
let job=ref({
type:'前端工程师',
salary:'10k'
})
function changeInfo(){
name.value='李四'
age.value=20
console.log("name",name)
}
function changeObject(){
console.log("job",job.value)
job.value.type='蓝翔技术工'
job.value.salary='50k'
}
//返回一个对象(常用)
return{
name,
age,
job,
changeInfo,
changeObject
}
}
}
script>
引用对象(reference对象,简称ref对象)
<template>
<h1>一个人的信息h1>
<h2>姓名:{{name}}h2>
<h2>年龄:{{age}}h2>
<h2>工作:{{job.type}}h2>
<h2>薪资:{{job.salary}}h2>
<h2>测试c:{{job.a.b.c}}h2>
<h2>爱好:{{hobby}}h2>
<button @click="changeInfo">修改人的信息button>
<button @click="changeObject">修改职位信息button>
<button @click="changeHobby">修改第一个爱好button>
template>
<script>
import {ref,reactive} from 'vue'
export default {
name: 'App',
setup(){
//数据
let name=ref('张三')
let age=ref(18)
let job=reactive({
type:'前端工程师',
salary:'10k',
a:{
b:{
c:1
}
}
})
let hobby=reactive(['吃饭','睡觉','打游戏'])
function changeInfo(){
name.value='李四'
age.value=20
console.log("name",name)
}
function changeObject(){
console.log("job",job)
job.type="蓝翔技术工"
job.salary="20k"
job.a.b.c=666
}
function changeHobby(){
hobby[0]="唱歌"
}
//返回一个对象(常用)
return{
name,
age,
job,
hobby,
changeInfo,
changeObject,
changeHobby
}
}
}
script>
<template>
<h1>一个人的信息h1>
<h2>姓名:{{person.name}}h2>
<h2>年龄:{{person.age}}h2>
<h2>工作:{{person.job.type}}h2>
<h2>薪资:{{person.job.salary}}h2>
<h2>测试c:{{person.job.a.b.c}}h2>
<h2>爱好:{{person.job.hobby}}h2>
<button @click="changePerson">修改人的信息button>
template>
<script>
import {reactive} from 'vue'
export default {
name: 'App',
setup(){
//数据
let person=reactive({
name:"张三",
age:18,
job:{
type:'前端工程师',
salary:'10k',
a:{
b:{
c:1
}
},
hobby:['吃饭','唱歌','看电影']
}
})
function changePerson(){
person.name="李四"
person.age=25
person.job.type='UI设计师'
person.job.salary='60k'
person.job.a.b.c=666
person.job.hobby[0]="跳舞"
}
//返回一个对象(常用)
return{
person,
changePerson
}
}
}
script>
对象类型
的响应式数据(基本类型不要用它,要用ref函数)代理对象(Proxy的实例对象,简称proxy对象)
<template>
<div class="bg">
<h1>我是Vue2写的效果h1>
<h2 v-show="person.name">姓名:{{person.name}}h2>
<h2>年龄:{{person.age}}h2>
<h2 v-show="person.sex">性别:{{person.sex}}h2>
<h2>爱好:{{person.hobby}}h2>
<button @click="addSex">新增一个sex属性button>
<button @click="deleteName">删除一个name属性button>
<button @click="changeHobby">修改第一个爱好button>
div>
template>
<script>
export default {
name: "App",
data(){
return{
person:{
name:"张三",
age:25,
hobby:["学习","读书","看报"]
}
}
},
methods:{
addSex(){
console.log(this.person.sex)
this.person.sex="女"
console.log(this.person.sex)
console.log("---------------------")
},
deleteName(){
console.log(this.person.name)
delete this.person.name
console.log(this.person.name)
console.log("---------------------")
},
changeHobby(){
console.log(this.person.hobby)
this.person.hobby[0]="唱歌"
console.log(this.person.hobby)
console.log("---------------------")
}
}
}
script>
<style>
style>
<template>
<div class="bg">
<h1>我是Vue2写的效果h1>
<h2 v-show="person.name">姓名:{{person.name}}h2>
<h2>年龄:{{person.age}}h2>
<h2 v-show="person.sex">性别:{{person.sex}}h2>
<h2>爱好:{{person.hobby}}h2>
<button @click="addSex">新增一个sex属性button>
<button @click="deleteName">删除一个name属性button>
<button @click="changeHobby">修改第一个爱好button>
div>
template>
<script>
import Vue from 'vue'
export default {
name: "App",
data(){
return{
person:{
name:"张三",
age:25,
hobby:["学习","读书","看报"]
}
}
},
methods:{
addSex(){
/*console.log(this.person.sex)
this.person.sex="女"
console.log(this.person.sex)
console.log("---------------------")*/
//界面有响应的
this.$set(this.person,'sex','女')
// Vue.set(this.person,'sex','女')
},
deleteName(){
/*console.log(this.person.name)
delete this.person.name
console.log(this.person.name)
console.log("---------------------")*/
//界面有响应的
this.$delete(this.person,'name')
// Vue.delete(this.person,'name')
},
changeHobby(){
/*console.log(this.person.hobby)
this.person.hobby[0]="唱歌"
console.log(this.person.hobby)
console.log("---------------------")*/
//界面有响应的
// this.$set(this.person.hobby,0,'唱歌')
this.person.hobby.splice(0,1,'唱歌')
}
}
}
script>
<style>
style>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue3的响应式原理title>
head>
<body>
<script>
let person={
name:"张三",
age:18
}
//模拟Vue2中实现响应式
let p={}
Object.defineProperty(p,'name',{
configurable:true, //可配置的,可以删除属性
get(){ //有人读取name时调用
return person.name
},
set(value){ //有人修改name时调用
console.log("有人修改了name属性,我发现了,我要去更新界面!")
person.name=value
}
})
Object.defineProperty(p,'age',{
get(){ //有人读取age时调用
return person.age
},
set(value){ //有人修改name时调用
console.log("有人修改了age属性,我发现了,我要去更新界面!")
person.age=value
}
})
script>
body>
html>
添加与删除一个属性都捕获不到
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue3的响应式原理title>
head>
<body>
<script>
let person={
name:"张三",
age:18
}
//模拟Vue2中实现响应式
// #region 解决vsCode中折叠后但又打开的情况
/* let p={}
Object.defineProperty(p,'name',{
configurable:true, //可配置的,可以删除属性
get(){ //有人读取name时调用
return person.name
},
set(value){ //有人修改name时调用
console.log("有人修改了name属性,我发现了,我要去更新界面!")
person.name=value
}
})
Object.defineProperty(p,'age',{
get(){ //有人读取age时调用
return person.age
},
set(value){ //有人修改name时调用
console.log("有人修改了age属性,我发现了,我要去更新界面!")
person.age=value
}
})*/
// #endregion
//模拟Vue3中实现响应式
const p=new Proxy(person,{
//有人读取p的某个属性时调用
get(target,propName){
console.log(`有人读取了p身上的${propName}属性`)
return target[propName]
},
//有人修改p的某个属性、或给p追加某个属性时调用
set(target,propName,value){
console.log(`有人修改了p身上的${propName}属性,我要去更新界面了`)
return target[propName]=value
},
//有人删除p的某个属性时调用
deleteProperty(target, propName) {
console.log(`有人删除了p身上的${propName}属性,我要去更新界面了`)
return delete target[propName]
}
})
script>
body>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue3的响应式原理title>
head>
<body>
<script>
let person={
name:"张三",
age:18
}
//模拟Vue2中实现响应式
// #region 解决vsCode中折叠后但又打开的情况
/* let p={}
Object.defineProperty(p,'name',{
configurable:true, //可配置的,可以删除属性
get(){ //有人读取name时调用
return person.name
},
set(value){ //有人修改name时调用
console.log("有人修改了name属性,我发现了,我要去更新界面!")
person.name=value
}
})
Object.defineProperty(p,'age',{
get(){ //有人读取age时调用
return person.age
},
set(value){ //有人修改name时调用
console.log("有人修改了age属性,我发现了,我要去更新界面!")
person.age=value
}
})*/
// #endregion
//模拟Vue3中实现响应式
/*const p=new Proxy(person,{
//有人读取p的某个属性时调用
get(target,propName){
console.log(`有人读取了p身上的${propName}属性`)
return target[propName]
},
//有人修改p的某个属性、或给p追加某个属性时调用
set(target,propName,value){
console.log(`有人修改了p身上的${propName}属性,我要去更新界面了`)
return target[propName]=value
},
//有人删除p的某个属性时调用
deleteProperty(target, propName) {
console.log(`有人删除了p身上的${propName}属性,我要去更新界面了`)
return delete target[propName]
}
})*/
obj={a:1,b:2}
//通过Reflect.defineProperty去操作
const x1=Reflect.defineProperty(obj,'c',{
get(){
return 3
}
})
const x2=Reflect.defineProperty(obj,'c',{
get(){
return 100
}
})
if(x2){
console.log("某某某操作成功了!")
}else{
console.log("某某某操作失败了!")
}
script>
body>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue3的响应式原理title>
head>
<body>
<script>
let person={
name:"张三",
age:18
}
//模拟Vue2中实现响应式
// #region 解决vsCode中折叠后但又打开的情况
/* let p={}
Object.defineProperty(p,'name',{
configurable:true, //可配置的,可以删除属性
get(){ //有人读取name时调用
return person.name
},
set(value){ //有人修改name时调用
console.log("有人修改了name属性,我发现了,我要去更新界面!")
person.name=value
}
})
Object.defineProperty(p,'age',{
get(){ //有人读取age时调用
return person.age
},
set(value){ //有人修改name时调用
console.log("有人修改了age属性,我发现了,我要去更新界面!")
person.age=value
}
})*/
// #endregion
//模拟Vue3中实现响应式
/*const p=new Proxy(person,{
//有人读取p的某个属性时调用
get(target,propName){
console.log(`有人读取了p身上的${propName}属性`)
return target[propName]
},
//有人修改p的某个属性、或给p追加某个属性时调用
set(target,propName,value){
console.log(`有人修改了p身上的${propName}属性,我要去更新界面了`)
return target[propName]=value
},
//有人删除p的某个属性时调用
deleteProperty(target, propName) {
console.log(`有人删除了p身上的${propName}属性,我要去更新界面了`)
return delete target[propName]
}
})*/
obj={a:1,b:2}
//通过Object.defineProperty去操作
const x1=Object.defineProperty(obj,'c',{
get(){
return 3
}
})
const x2=Object.defineProperty(obj,'c',{
get(){
return 100
}
})
//通过Reflect.defineProperty去操作
/*const x1=Reflect.defineProperty(obj,'c',{
get(){
return 3
}
})
const x2=Reflect.defineProperty(obj,'c',{
get(){
return 100
}
})
if(x2){
console.log("某某某操作成功了!")
}else{
console.log("某某某操作失败了!")
}*/
script>
body>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue3的响应式原理title>
head>
<body>
<script>
let person={
name:"张三",
age:18
}
//模拟Vue2中实现响应式
// #region 解决vsCode中折叠后但又打开的情况
/* let p={}
Object.defineProperty(p,'name',{
configurable:true, //可配置的,可以删除属性
get(){ //有人读取name时调用
return person.name
},
set(value){ //有人修改name时调用
console.log("有人修改了name属性,我发现了,我要去更新界面!")
person.name=value
}
})
Object.defineProperty(p,'age',{
get(){ //有人读取age时调用
return person.age
},
set(value){ //有人修改name时调用
console.log("有人修改了age属性,我发现了,我要去更新界面!")
person.age=value
}
})*/
// #endregion
//模拟Vue3中实现响应式
const p=new Proxy(person,{
//有人读取p的某个属性时调用
get(target,propName){
console.log(`有人读取了p身上的${propName}属性`)
// return target[propName]
return Reflect.get(target,propName)
},
//有人修改p的某个属性、或给p追加某个属性时调用
set(target,propName,value){
console.log(`有人修改了p身上的${propName}属性,我要去更新界面了`)
// return target[propName]=value
return Reflect.set(target,propName,value)
},
//有人删除p的某个属性时调用
deleteProperty(target, propName) {
console.log(`有人删除了p身上的${propName}属性,我要去更新界面了`)
// return delete target[propName]
return Reflect.deleteProperty(target,propName)
}
})
/*obj={a:1,b:2}
//通过Object.defineProperty去操作
const x1=Object.defineProperty(obj,'c',{
get(){
return 3
}
})
const x2=Object.defineProperty(obj,'c',{
get(){
return 100
}
})
*/
//通过Reflect.defineProperty去操作
/*const x1=Reflect.defineProperty(obj,'c',{
get(){
return 3
}
})
const x2=Reflect.defineProperty(obj,'c',{
get(){
return 100
}
})
if(x2){
console.log("某某某操作成功了!")
}else{
console.log("某某某操作失败了!")
}*/
script>
body>
html>
Object.defineProperty(data,'count',{
get(){},
set(){}![请添加图片描述](https://img-blog.csdnimg.cn/6b2ee7c1953e4b958834375f9718e4ec.gif)
})
new Proxy(data,{
//拦截读取属性值
get(target,prop){
return Reflect.get(target,prop)
},
//拦截设置属性值或添加新属性
set(target,prop,value){
return Reflect.set(target,prop,value)
},
//拦截删除属性
deleteProperty(target,prop){
return Reflect.deleteProperty(target,prop)
}
})
proxy.name="tom"
基本类型数据
对象(或数组)类型数据
对象(或数组)类型数据
,它内部会自动通过reactive转为代理对象
需要
.value,读取数据时模板中直接读取不需要
.value均不需要
.value