程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

全面拥抱vue3.0

发布于2021-05-30 12:02     阅读(954)     评论(0)     点赞(14)     收藏(0)


vue2.0和vue3.0的区别

  • 重写了虚拟DOM的实现(跳过静态节点,只处理动态节点)。
  • update性能提高1.3~2倍。
  • SSR(服务处理)速度提高了2~3倍。
  • 可以将无用的模块剪辑,仅打包需要的(按需打包)。
  • 不在限于模板中的单个根节点。
  • 更好的typeScript支持。
  • 组合式API(setup)替换原有的OptionsAPI
    • 根据逻辑相关性组织代码,提高可读性和可维护性
    • 更好的重用逻辑代码(避免mixins混入时命名冲突的问题)
    • 但是依然可以沿用Options
    1. //Options API
    2. export default {
    3. data() {
    4. return{
    5. }
    6. },
    7. methods:{
    8. },
    9. computed:{
    10. }
    11. }
    12. //组合式API
    13. export default {
    14. setup(){
    15. }
    16. }
    17. 复制代码

如何创建vue3.0项目

基于vue/cli配置vue3.0

  • vue/cli脚手架必须是4.3.1版本以上
  • 使用创建项目命令vue create 项目名
  • 最后加上vue add vue-next,创建3.0的项目

基于vite配置vue3.0

  • 有尤雨溪开发的web开发工具,基于浏览器原生ES imports的开发服务器(利用浏览器解析imports,在服务器端按需编译返回,完全跳过了打包这个概念,服务器随起随用),同时不仅有vue文件的支持,还搞定了热更新,而且热更新的速度不会随着模块增多而变慢。
  • npm i vite-app 项目名
  • cd 项目名
  • npm i
  • npm run dev

掌握setup和响应式系统API

响应式系统工具集

ref

  • 接收一个参数值并返回一个响应式且可改变的ref对象。
    • ref对象拥有一个指向内部值的一个属性.value
    • 当ref在模板中使用的时候,他会自动解套,无需在模板内部额外写.value(意思是return出来以后,用小胡子就可以直接使用)
    • ref不是Proxy实现的。

unref

  • 如果参数是一个ref,则返回它的value值,否则返回参数本身,他是val = isRef(val)? val.value:val的语法槽
  1. let a = '你好',
  2. b = ref(2)
  3. console.log(unref(a,b)) //'你好',2
  4. 复制代码

toRef

  • 将参数转化为ref对象,例如
    1. let a = 0;
    2. console.log(toRef(a)) //ObjectRefImpl {_object: 0, _key: undefined, __v_isRef: true}
    3. 复制代码

toRefs

  • 把响应式对象转为普通对象,该普通对象每一个property都是一个ref,和响应式对象property一一对应。

isRef

  • 判断该值是否为ref对象,如果是则返回true,否则是false
    1. let a = 0
    2. console.log(isRef(a)) // false
    3. 复制代码

isProxy

  • 检查一个对象是否由reactive或者readonly方法创建的代理

isReactive

  • 检查一个对象是否由reactive创建的响应式代理。
    • 如果这个代理是由reactive创建的,但是又被reactive创建的另一个代理包裹了一层,那么同样会返回true

isReaonly

  • 检查一个对象是否由readonly创建的只读代理。

readonly

  • 传入一个对象(响应式或者普通)或ref,返回一个原始对象的只读代理,一个只读的代理是深层的,对象内部任何嵌套的属性也只是只读的。

高级系统响应式API

customRef

computed

  • 传入一个getter函数,返回一个默认不可手动修改的ref对象。
  1. // 第一种写法:不可手动修改值
  2. setup() {
  3. let a = computed(()=>{
  4. let total = state.supNum + state.oppNum
  5. return ((state.supNum/total)*100).toFixed(2) + '%'
  6. })
  7. return{
  8. a
  9. }
  10. }
  11. //第二种写法:可以利用set修改,当a所依赖的值supNum和oppNum改变会触发get回调函数,如果修改a的值会触发set回调函数(a.vlue = a.vlue+1就会触发)
  12. setup() {
  13. let a = computed({
  14. get:()=>{
  15. let total = state.supNum + state.oppNum
  16. return ((state.supNum/total)*100).toFixed(2) + '%'
  17. }
  18. set:(val)=>{
  19. console.log(val,222)
  20. }
  21. })
  22. return{
  23. a
  24. }
  25. }
  26. 复制代码

watchEffect

  • 立即执行传入的一个函数,并响应式追踪其依赖,并在其依赖变更时重新运行该函数。
    1. setup(props){
    2. watchEffect(()=>{
    3. console.log(props.title)//第一次渲染的时候就会立即执行一次
    4. })
    5. let y = ref(0),
    6. z = ref(0);
    7. //如果需要监听多个值
    8. watchEffect(()=>{
    9. console.log(y.value,z.value)//必须写value值,因为咱们监听的是value值,不是y的ref对象
    10. })
    11. }
    12. 复制代码

watch

  • watch完全等价于2.0的watch
    • watch需要侦听特定的数据源,并在回调函数中执行。
    • 默认情况是懒执行的,也就是说仅在侦听的源变更时才执行回调。第一次加载页面是不执行的,和watchEffect不一样。
    1. //侦听单个数据
    2. setup(){
    3. watch(state,()=>{
    4. console.log(state.supNum)
    5. })
    6. //侦听state下的某个数据
    7. watch(()=>state.supNum,()=>{
    8. console.log('你好'+state.supNum)
    9. })
    10. //侦听ref创建的响应式数据,输出改变后的值和之前的值
    11. let x = ref(0)
    12. setup(){
    13. watch(x,(x,prevX)=>{
    14. console.log(x,prevX)
    15. })
    16. }
    17. //侦听多个数据用数组传参,数组中任意值改变都会触发watch函数
    18. watch([x,y],([x,y],[prevx,prevy]=>{
    19. console.log(x,y,prevx,prevy)//prevx,prevy改变之前的值
    20. }))
    21. 复制代码

watchEffect和watch的区别

  • 不需要手动传入依赖值。
  • 每次初始化时会执行一次回调函数来获取依赖值。
  • 无法获取原值,只能获取改变后的值。

setup

  • setup函数是一个新的组件选项,作为在组件内使用的CompositionAPI的入口点。
    • 初始化props和beforeCreate之间调用
    • 可以接收props和context
    • this在setup中不可用,因为实在beforeCreate之前执行的,这时候还没有创建this实例。
  • setup(props)
    • props是基于Proxy代理的响应数据
  • setup语法
    1. setup(){
    2. //return出去的值可以直接在html中使用,{{num}}
    3. return{
    4. }
    5. }
    6. 复制代码

构建响应式数据

方法一,利用ref,一般处理简单值的响应式

  • 原理还是基于defineProperty监听value值
  1. <template>
  2. <div>
  3. <h3>{{ title }}</h3>
  4. <div>
  5. <p>支持人数:{{ supNum }}</p>
  6. <p>反对人数:{{ oppNum }}</p>
  7. <p>支持率:</p>
  8. <button @click="change(0)">支持</button>
  9. <button @click="change(1)">反对</button>
  10. </div>
  11. </div>
  12. </template>
  13. // 第一种直接使用ref,比较麻烦
  14. setup() {
  15. let supNum = ref(0),
  16. oppNum = ref(0);
  17. functiom change(x){
  18. x == 0? supNum.value++:oppNum.value++
  19. }
  20. return{
  21. supNum,
  22. oppNum,
  23. change,
  24. }
  25. }
  26. // 第二种ref,创建一个ref对象
  27. setup(){
  28. let state = ref({
  29. supNum:0
  30. oppNum:0
  31. })
  32. function change(x){
  33. x == 0? state.value.supNum++ : state.value.oppNum++
  34. }
  35. return{
  36. state
  37. }
  38. //html在使用的时候,{{state.supNum}}
  39. }
  40. 复制代码

方法二,利用 reactive

  • 基于Proxy对数据进行深度的监听,以此构建响应式
    • 接收一个普通对象然后返回该普通对象的响应式代理
    • 响应式转换是深层的,会影对象内部所有嵌套的属性
  1. setup() {
  2. let state = reactive({
  3. supNum: 0,
  4. oppNum; 0
  5. })
  6. function change(x){
  7. x == 0? state.supNum++ : state.oppNum++
  8. // 比Object.defineProperty好用在于,对与数据或者并未初始化的对象成员,都可以随意的改变值,而且具备响应式的数据。
  9. }
  10. return{
  11. ...toRefs(state),
  12. change
  13. }
  14. //html在使用的时候,{{supNum}}
  15. }
  16. 复制代码

模板refs

  1. <template>
  2. <div>
  3. <div ref="root">你好</div>
  4. </div>
  5. </template>
  6. export default {
  7. setup(){
  8. let root = ref();
  9. onMounted(()={
  10. console.log(root.value) //返回值是div元素
  11. })
  12. return{
  13. root
  14. }
  15. }
  16. }
  17. 复制代码

生命周期函数

  • beforeCreate=>使用setup
  • create=>使用setup
  • beforeMount=>onBeforeMount 第一次挂载之前
  • mounted=>onMounted 第一次挂载之后
  • beforeUpdate=>onBeforeUpdate 组件更新之前
  • updated=>onUpdated 组件更新之后
  • beforeDestroy=>onBeforeUnmount 组件销毁之前
  • destoryed=>onUnmounted 组件销毁之后
  • errorCaptured=>onErrorCaptured



所属网站分类: 技术文章 > 博客

作者:前端黄柠檬

链接:http://www.qianduanheidong.com/blog/article/116107/a4a8a7c2732829de2956/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

14 0
收藏该文
已收藏

评论内容:(最多支持255个字符)