(1).了解VUE3源码管理方式、独立使用reactivity、搭建项目
1.了解VUE3源码管理方式、独立使用reactivity
npm init -y
npm i @vue/reactivity -D
import {reactive} from '@vue/reactivity';
const state = reactive({
name:'zza',
info:{
job:'teacher',
student:[
{
id:1,
name:'小张'
}
]
},
hobby:['pinao','travel','film']
})
npm i webpack@4.44.1 webpack-cli@3.3.12 webpack-dev-server@3.11.0
yarn add html-webpack-plugin@4.4.1
const path = require('path'),
HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports={
entry:'./src/index.js',
output:{
filename:'bundle.js',
path:path.resolve(__dirname,'dist')
},
devtool:'source-map',
resolve:{
modules:[path.resolve(__dirname,''),path.resolve(__dirname,'node_modules')]
},
plugins:[
new HtmlWebpackPlugin({
template:path.resolve(__dirname,'public/index.html')
})
]
}
"scripts": {
"dev":"webpack-dev-server",
"build":"webpack"
},
(2).认识Proxy与Reflect、实现基本得数据代理
import {reactive} from 'src/vue3/reactivity'
const state = reactive({
name:'zza',
info:{
job:'teacher',
student:[
{
id:1,
name:'小张'
}
]
},
hobby:['pinao','travel','film']
})
state.name="lgx"
import {isObject} from '../shared/utils'
import {mutableHandler} from './mutableHandler'
function reactive(target){
return createReactiveObject(target,mutableHandler);
}
function createReactiveObject(target,baseHandle){
if(!isObject(target)){
return target
}
const observer = new Proxy(target,baseHandle);
return observer;
}
export{
reactive
}
function isObject(value){
return typeof value === 'object' && value !==null;
}
export{
isObject
}
const get = createGetter(),
set = createSetter();
function createGetter(){
return function get(target,key,receiver){
const res = Reflect.get(target,key,receiver);
console.log('响应式获取'+target[key]);
return res;
}
}
function createSetter(){
return function set(target,key,value,receiver){
const res = Reflect.set(target,key,value,receiver);
console.log('响应式设置'+key+'='+value);
return res;
}
}
const mutableHandler={
get,set
}
export {
mutableHandler
}
import {isObject} from '../shared/utils'
import {mutableHandler} from './mutableHandler'
function reactive(target){
return createReactiveObject(target,mutableHandler);
}
function createReactiveObject(target,baseHandle){
if(!isObject(target)){
return target
}
const observer = new Proxy(target,baseHandle);
return observer;
}
export{
reactive
}
state.name="lgx"
(3).递归操作、新增与修改得区分
state.hobby[0] = 'conding'
import {isObject} from '../shared/utils';
import {reactive} from './reactivity';
import {hasOwnProperty,isEaual} from '../shared/utils'
const get = createGetter(),
set = createSetter();
function createGetter(){
return function get(target,key,receiver){
const res = Reflect.get(target,key,receiver);
console.log('响应式获取'+target[key]);
if(isObject(res)){
return reactive(res);
}
return res;
}
}
function createSetter(){
return function set(target,key,value,receiver){
const isKeyExist = hasOwnProperty(target,key),
oldValue = target[key],
res = Reflect.set(target,key,value,receiver);
if(!isKeyExist){
console.log('响应式新增'+value);
}else if(!isEaual(value,oldValue)){
console.log('响应式修改'+key+'='+value);
}
return res;
}
}
const mutableHandler={
get,set
}
export {
mutableHandler
}
function isObject(value){
return typeof value === 'object' && value !==null;
}
function hasOwnProperty(target,key){
return Object.prototype.hasOwnProperty.call(target,key)
}
function isEaual(newValue,oldValue){
return newValue === oldValue
}
export{
isObject,hasOwnProperty,isEaual
}
import {reactive} from 'src/vue3/reactivity'
const state = reactive({
name:'zza',
info:{
job:'teacher',
student:[
{
id:1,
name:'小张'
}
]
},
hobby:['pinao','travel','film']
})
state.name="lgx"
state.hobby[0] = 'conding'
(3).总结
vue,proxy代理底层就是重写了get set方法,传入道proxy中,set中判断是否存在,和是否与之前的值一致,来鉴别新增和修改操作。对数组操作方法也有了响应,性能更高了,不是一上来全部递归劫持