VUE3 ONE-PIECE_vue3 one piece-程序员宅基地

技术标签: 前端  vue.js  javascript  

VUE3 ONE-PIECE

1.初识VUE3

1.使用vite创建vue3工程

npm init vite-app vue3_test_vite
  • vite 启动速度快*

2.工程结构

VUE3不再引入vue构造函数而是 引入一个 createapp 的工厂函数

import { createApp } from 'vue' 
import App from './App.vue'
//创建app实例对象类似于vm 但是app比vm更加轻 
//mount 挂载 unmount 卸载
ceateApp(App).mount('#app')

原VUE2

import Vue from 'vue'
new Vue({
    render: (h)=> {return h('App')}
}).$mount('#app')

3.templete标签

可以直接 写标签不用再在 templete 里包 div

<template>
  <img alt="Vue logo" src="./assets/logo.png">
  <HelloWorld msg="Welcome to Your Vue.js App"/>
</template>

2.常用的composition API (组合式API)

compositionAPI 太抽象了 兄弟们

1.拉开序幕的setup

vue3 的新配置项 setup 是所有的 composition API 表演的舞台

vue3 中所有的: data method computed 均要配置到setup里

setup 的返回值可以直接在 模板 、方法 中调用

setup 可以返回一个 渲染函数

setup() {
    let name = 'zs';
    let age = 12;

    function showName() {
      alert(name)
    }
    return { //setup的返回值
      name,
      age,
      showName
    }
  }

注意 : 1. 不要将 vue2 与 vue3 混用,当两者发生冲突是会以vue3为主

   2.setup 不能是一个 async 函数,因为其返回值不是return里的对象而是一个promise

2.ref函数

定义一个相应式数据

1.普通数据 与 响应式 数据

傻缺儿子: 非相应式数据

setup() {
    let name = 'zs';
    let age = 12;
}

响应式数据:

setup() {
    let name = ref('zs');
    let age = ref(12);
}

ref 加工后的数据变为: ref把数据包转成对象的形式

RefImpl {__v_isShallow: false, dep: Set(1), __v_isRef: true, _rawValue: 'zs', _value: 'zs'}
RefImpl {__v_isShallow: false, dep: Set(1), __v_isRef: true, _rawValue: 12, _value: 12}

从单词层面理解ref : RefImpl = reference + implement 引用实现对象 简称 引用对象

                         引用          实现

通过objectpropoty 与 getter、setter 实现

下面让我们打开 RefImpl 进一步观察

RefImpl {__v_isShallow: false, dep: Set(1), __v_isRef: true, _rawValue: 'zs', _value: 'zs'}
|----dep: Set(1) {ReactiveEffect}
    |----__v_isRef: true
    |----__v_isShallow: false
    |----_rawValue: "zs"
    |----_value: "zs"
    |----value: (...)
|----[[Prototype]]: Object
    |----constructor: class RefImpl
    |----value: (...)
    |----get value: ƒ value()
    |----set value: ƒ value(newVal)
    |----[[Prototype]]: Object

这里我们看到了 getter 与 setter 可以确定 ref 是通过数据劫持来实现响应式

现在我们知道要改变页面中的数据必须使用 <数据>.value 的形式 但模板中使用数据 不需要 <数据>.value 因为vue已经帮你用了.value

  1. ref包裹对象

    setup() {
    let name = ref(“zs”);
    let age = ref(12);
    let job = ref({
    type: ‘前端工程师’,
    salary: ‘2K’
    })
    function showName() {
    // alert(name)
    console.log(name,age,job.value);
    }

可以看到输出的job.value

Proxy {type: '前端工程师', salary: '2K'}
 |----[[Handler]]: Object
 |----[[Target]]: Object
 |----[[IsRevoked]]: false

他并没用将 job 对象中的每个 属性都用 ref 包裹而是用了 Proxy 的形式,并且我们使用 job 中的属性只要 job.value.type 不要 job.value.type.value 因为元素不在用 refimpl 包裹

具体要如何 用到 proxy 我们看到下一小节

3.reactive函数

定义一个 对象类型 的响应式数据

ref 即可 用到 对象类型 又可用到 普通类型

那么问题来了: 为什么还用reactive呢?

  let job1 = reactive({
    type: "前端工程师",
    salary: "2K",
});

我们可以在定义数据时做这样的处理 :

  let person = reactive({
        name: "zs",
        age: 10,
        job: {
            type: "前端工程师",
            salary: "10k",
        },
});

于是在修改数据时我们就要这样处理 :

 function showName() {
   	// alert(name)
    person.name = "张三",
    person.age = 100,
    person.job.type = "UI",
    person.job.salary = "20K";
    console.log(person);
}

于是我们就不用在person.value.<属性>了 确实在这里我还有一些疑惑(这也没方便多少呀?) 但是老师说了 后面会解决

4.vue3里的响应式原理

1.下回顾一下vue2 里的响应式原理 :

对象类型 通过definePropoty()对属性的读取、修改进行拦截(数据劫持)

数组类型 通过重写数组的方法进行拦截

总而言之就是要调用 对象上 的方法使其可以检测到数据的改变

this.$set() 使得修改数据得到检测 其实还有Vue.set()
同时还有我们没讲到的 $delete 检测删除

修改数组

也可以用$set(<数组>,<索引>,<值>)
       或者<数组>.splice(开始的索引,删除几个,值)

存在问题 :删除或者新增元素不会更新

2.vue3的响应式原理 :

git强推 直接覆盖远程仓库:

方法二:强推

即利用强覆盖方式用你本地的代码替代git仓库内的内容

git push -f origin master

模拟vue2

 <script>
        //模拟vue2响应式
        let person = {
            name: '张三',
            age: 123
        }
        let p = {}
        Object.defineProperty(p, 'name', {
            get() {
                console.log('有人读取了name');
                return person.name
            },
            set(value) {
                console.log('@@@有人修改了name');
                person.name = value
            }
        });
        Object.defineProperty(p, 'age', {
            get() {
                console.log('有人读取了age');
                return person.age
            },
            set(value) {
                console.log('@@@有人修改了age');
                person.age = value
            }
        })
    </script>

我们可以看到在这里 无法用 delete 和 添加属性

小知识 //#region //#endregion 强制折叠

模拟vue3

 //模拟vue3响应式
const p = new Proxy(person, {
    get(target, propName) {
        console.log(`有人读取了p身上的${propName}属性`);
        return target[propName]
    },
    set(target, propName, value) {
        console.log(`有人修改了p上的${propName}属性`);
        target[propName] = value
    },
    delete(target, propName) {
        console.log(`有人删除了p上的${propName}属性`);
        delete target[propName]
    }
})

下面再用介绍一下 reflexct

reflect与Object有着差不多的操作 reflect有返回值 如果要reflect进行错误处理跟加方便 而Objcet要进行try catch包裹

Reflect.defineProperty(p, 'name', {
    get() {
        console.log('有人读取了name');
        return person.name
    },
    set(value) {
        console.log('@@@有人修改了name');
        person.name = value
    }
});
Reflect.defineProperty(p, 'age', {
    get() {
        console.log('有人读取了age');
        return person.age
    },
    set(value) {
        console.log('@@@有人修改了age');
        person.age = value
    }
})

reflect 模拟

const p = new Proxy(person, {
    get(target, propName) {
        console.log(`有人读取了p身上的${propName}属性`);
        return Reflect.get(target.propName)
    },
    set(target, propName, value) {
        console.log(`有人修改了p上的${propName}属性`);
        Reflect.set(target, propName, value)
    },
    deleteProperty(target, propName) {
        console.log(`有人删除了p上的${propName}属性`);
        return Reflect.deleteProperty(target, propName)
        //返回Reflect.deleteProperty(target, propName)的结果否者返回undefind
    }
})

用reflet 可以返回成功或者失败 也就可以更方便的进行 错误处理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Iambill616/article/details/128328500

智能推荐

vue引入原生高德地图_前端引入原生地图-程序员宅基地

文章浏览阅读556次,点赞2次,收藏3次。由于工作上的需要,今天捣鼓了半天高德地图。如果定制化开发需求不太高的话,可以用vue-amap,这个我就不多说了,详细就看官网 https://elemefe.github.io/vue-amap/#/zh-cn/introduction/install然而我们公司需要英文版的高德,我看vue-amap中好像没有这方面的配置,而且还有一些其他的定制化开发需求,然后就只用原生的高德。其实原生的引入也不复杂,但是有几个坑要填一下。1. index.html注意,引入的高德js一定要放在头部而_前端引入原生地图

ViewGroup重写大法 (一)-程序员宅基地

文章浏览阅读104次。本文介绍ViewGroup重写,我们所熟知的LinearLayout,RelativeLayout,FrameLayout等等,所有的容器类都是ViewGroup的子类,ViewGroup又继承View。我们在熟练应用这些现成的系统布局的时候可能有时候就不能满足我们自己的需求了,这是我们就要自己重写一个容器来实现效果。ViewGroup重写可以达到各种效果,下面写一个简单的重写一个Vi..._viewgroup 重写

Stm32学习笔记,3万字超详细_stm32笔记-程序员宅基地

文章浏览阅读1.8w次,点赞279次,收藏1.5k次。本文章主要记录本人在学习stm32过程中的笔记,也插入了不少的例程代码,方便到时候CV。绝大多数内容为本人手写,小部分来自stm32官方的中文参考手册以及网上其他文章;代码部分大多来自江科大和正点原子的例程,注释是我自己添加;配图来自江科大/正点原子/中文参考手册。笔记内容都是平时自己一点点添加,不知不觉都已经这么长了。其实每一个标题其实都可以发一篇,但是这样搞太琐碎了,所以还是就这样吧。_stm32笔记

CTS(13)---CTS 测试之Media相关测试failed 小结(一)_mediacodec框架 cts-程序员宅基地

文章浏览阅读1.8k次。Android o CTS 测试之Media相关测试failed 小结(一)CTSCTS 即兼容性测试套件,CTS 在桌面设备上运行,并直接在连接的设备或模拟器上执行测试用例。CTS 是一套单元测试,旨在集成到工程师构建设备的日常工作流程(例如通过连续构建系统)中。其目的是尽早发现不兼容性,并确保软件在整个开发过程中保持兼容性。CTS 是一个自动化测试工具,其中包括两个主要软件组件:CTS tra..._mediacodec框架 cts

chosen.js插件使用,回显,动态添加选项-程序员宅基地

文章浏览阅读4.5k次。官网:https://harvesthq.github.io/chosen/实例化$(".chosen-select").chosen({disable_search_threshold: 10});赋值var optValue = $(".chosen-select").val();回显1.设置回显的值$(".chosen-select").val(“opt1”);2.触发cho..._chosen.js

C++ uint8_t数据串如何按位写入_unit8_t 集合 赋值 c++-程序员宅基地

文章浏览阅读1.9k次。撸码不易,网上找不到,索性自己写,且撸且珍惜!void bitsWrite(uint8_t* buff, int pos, int size, uint32_t value){ uint32_t index[] = { 0x80000000, 0x40000000, 0x20000000, 0x10000000, 0x8000000, 0x4000000, 0x2000000, 0x1000000, 0x800000, 0x400000, 0_unit8_t 集合 赋值 c++

随便推点

Javaweb框架 思维导图_javaweb框架图-程序员宅基地

文章浏览阅读748次。javaweb知识点_javaweb框架图

adb的升级与版本更新_adb iptabls怎么升级-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏16次。adb是没有自动升级的命令的,如果想要更新adb的版本,我们可以在网上找到自己想要的版本进行更新给大家提供几个版本https://pan.baidu.com/s/1yd0dsmWn5CK08MlyuubR7g&shfl=shareset 提取码: 94z81、下载解压后我们可以找到下面几个文件,并复制2、找到adb安装的文件夹下的platform-tools文件夹,我这里是..._adb iptabls怎么升级

微信苹果版删除所有的聊天记录的图文教程_mac微信怎么删除聊天列表-程序员宅基地

文章浏览阅读3.8k次。很多用户可能都知道怎么在Windows系统上删除微信的聊天记录,那么苹果电脑上的微信软件怎么删除所有的聊天记录呢?下面小编就专门来给大家讲下微信mac版删除所有的聊天记录的图文教程。点击后会弹出提示窗口,点击这里的确认按钮就可以将其清理掉了。在这里选择要清理的数据,然后点击下方右边的清理按钮就行了。在mac上打开微信后,点击左下角的横线图标。然后再点击这里的管理微信聊天数据按钮。打开了设置窗口,点击上方的“通用”。在这里点击下方的前往清理按钮。点击弹出菜单里的“设置”。_mac微信怎么删除聊天列表

【报错笔记】数据类型转换时报错:Request processing failed;nested exception is java.lang.NumberFormatException:..._request processing failed; nested exception is jav-程序员宅基地

文章浏览阅读7.7k次。数据类型转换时报错:Request processing failed;nested exception is java.lang.NumberFormatException:For input String “20151512345”报错原因:数字格式异常,接着后面有 For input string: “201515612343” 提示,这就告诉我们你当前想把 “201515612343” 转换成数字类型时出错了。解决方案:使用2015151612343这个数字太大了,所以直接使用string_request processing failed; nested exception is java.lang.numberformatexcepti

qml 自定义消息框_Qt qml 自定义消息提示框-程序员宅基地

文章浏览阅读387次。版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/a844651990/article/details/78376767Qt qml 自定义消息提示框QtQuick有提供比较传统的信息提示框MessageDialog,但是实际开发过程并不太能满足我们的需求。下面是根据controls2模块中..._qml 自定义 messagedialog

Redis.conf 默认出厂内容_默认出厂的原始redis.conf文件全部内容-程序员宅基地

文章浏览阅读599次。# Redis configuration file example.## Note that in order to read the configuration file, Redis must be# started with the file path as first argument:## ./redis-server /path/to/redis.conf # Note on units: when memory size is needed, it is pos._默认出厂的原始redis.conf文件全部内容

推荐文章

热门文章

相关标签