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

智能推荐

以MapBox为核心构建Vue地图组件库教程_vue 省份 地图组件库-程序员宅基地

文章浏览阅读951次。不多废话直接讲干货,首先我们要清楚如何写一套组件库,类似于使用vue编写的elementui,使用react编写的antdesign等,我们现在要以GIS为核心写组件库,其实原理类似。一个是组件的主体vue文件,另一个是将组件局部暴露出去的index.js文件,当然你可以再此基础上增加你想要的其他的js文件和vue文件,上面讲的两个文件是必须的。这行命令可以将你写的组件库打包成压缩文件,一般是一个dist静态目录,在进行npm发布的时候也是将这个静态的dist发布在官网上。_vue 省份 地图组件库

【控制control】四足机器人弹簧加载倒立摆(SLIP)动力学模型_【控制control】四足机器人动力学模型-slip-程序员宅基地

文章浏览阅读4.9k次,点赞5次,收藏32次。系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加TODO:写完再整理文章目录系列文章目录前言1.动力学建模构型方法2.四足机器人动力学模型(1)多体动力学模型【针对躯干+脚建模】方法一:VMC( Virtual Model Controller)模型方法二:SLIP模型(2)浮基单体动力学模型【针对躯干建模】【用于MPC】前言认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对四足机器人动力学模型-VMC、SLIP和浮动机体模型做个简_【控制control】四足机器人动力学模型-slip

html5手指点击速度,CPS手速测试 - 鼠标点击速度测试插件-程序员宅基地

文章浏览阅读1.2w次。CPS手速测试插件背景简介为了刺激客户的消费很多购物平台都推出来秒杀抢购的活动,在这个活动中如果你的手速慢就抢不到商品,所以有时我们会需要锻炼一下自己的手速,那如何知道自己的手速是快还是慢呢,在世界平均范围中又处于何种地步,今天小编为大家推荐一款可以检测自己手速的插件CPS手速测试。CPS手速测试插件简介CPS手速测试插件是一款可以在线测试鼠标点击速度的检测工具,它可以是1/3/5/10/15/3..._测速度插件

VLAN以及三层交换机_核心交换机如何查询vlan-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏7次。VLAN以及三层交换机1、VLAN概述与优势1.1vlan概述1.2vlan优势1.3VLAN的分类Trunk概述三层交换技术1、VLAN概述与优势1.1vlan概述VLAN(Virtual Local Area Network),中文称为虚拟局城网。是一组逻辑上隔离的设备和用户。这些设备和用户不受物理位置限制,可根据部门成组等进行灵活划分,保障信息安全。同时隔绝广播信息,提升网络效能,防止广播风暴的产生。1.2vlan优势1. 限制广播域。广播域被限制在一个VLAN内,提高了网络处理能力。 2_核心交换机如何查询vlan

clearTimeout无效_cleartimeout不生效-程序员宅基地

文章浏览阅读7.3k次。如图所示clearTimeout接受id作为参数,所以检查一下是否传入的不是id因为默认情况下setTimeout方法是会返回id但有时候会返回一个setTimeout对象比如使用vsCode 开发的同学在使用setTimeout时会自动引入timer对象,此时setTimeout就会返回Timeout对象,此时只需要将对应的id传入即可或者直接将引用注掉..._cleartimeout不生效

安卓发送post请求_android post-程序员宅基地

文章浏览阅读1.6k次。在HTTP通信中使用最多的就是GET和POST了,GET请求可以获取静态页面,也可以把参数放在URL字符串的后面,传递给服务器。本文将使用标准Java接口HttpURLConnection,以一个实例演示如何使用POST方式向服务器提交数据,并将服务器的响应结果显示在Android客户端。在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持。将提交的数据写入Log\Log.php文件中。_android post

随便推点

HDU - 1272 小希的迷宫之独木桥(并查集的简单应用)-程序员宅基地

文章浏览阅读236次。小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)_hdu - 1272

RAD Studio 11.2详解其务实改进(Delphi & C++ Builder)-Alexandria-程序员宅基地

文章浏览阅读7.4k次,点赞5次,收藏11次。● 开发人员生产力:“搬运式的复用”是一个特性。使用Delphi和C++Builder使得开发机构交付订单和市场需求的速度提高了5倍有余。● 快速的“原生”应用程序:操作系统本机的原生编译器,赋能App应用应有的原生速度(没有任何臃肿)。● 数据库访问:Delphi最原始的关键设计之一,就是将数据库访问完全集成到RAD Studio之中。● 强大的C++库:数百个C++库,可以在C++Builder中使用,或者在RAD Studio中的Delphi下使用。_rad studio

shiro@RequiresPermission校验实现_requirespermissions 校验的是-程序员宅基地

文章浏览阅读864次。shiro-spring借助Spring AOP特性实现shiro的注解式校验引入shiro-spring依赖后一定要注入AuthorizationAttributeSourceAdvisor以便借助spring aop进行shiro注解校验 @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) ..._requirespermissions 校验的是

唱响中国-红歌36首-刘和刚 - 好男儿就是要当兵-程序员宅基地

文章浏览阅读308次。歌曲下载/歌词下载:http://dl.iteye.com/topics/download/be412093-1ed9-3086-aeaf-e132ca9a1758刘和刚 - 好男儿就是要当兵歌词:好男儿就是要当兵刘和刚唱响中国-红歌36首当兵才知道帽徽为什么这样红当兵才知道肩章为什么这样重当兵才知道祖国的山河在心中咱当了兵才知道好男儿 嘿 就是要当兵当兵才知道过去的模样太放松当兵..._当兵的人才知道自己的骨头有多硬

探索iOS转场动画_ios 转场动画-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏3次。iOS提供图像转场动画,可实现酷炫的转场特效。动画包括:溶解、折叠、复印机、闪烁、翻页、波纹、滑动等等。_ios 转场动画

Java 本地内存 & 直接内存 & 元空间_java 本地内存和直接内存-程序员宅基地

文章浏览阅读4.1k次,点赞7次,收藏26次。Java虚拟机在执行的时候会把管理的内存分配到不同的区域,这些区域称为虚拟机内存;同时对于虚拟机没有直接管理的物理内存,也会有一定的利用,这些被利用但不在虚拟机内存的地方称为本地内存。元空间不在虚拟机中,而是使用本地内存,JVM不会再出现方法区的内存溢出问题。..._java 本地内存和直接内存

推荐文章

热门文章

相关标签