Vue3开发踩坑

news/2024/7/9 23:42:39 标签: vue, app, 踩坑

期待了很久的vue3,一发布就上手体验了一把,这里记录几个自己碰到的网上不常见的小坑~

自定义全局参数

定义:

// main.js
const app = createApp(App)

app.config.globalProperties.$test = 'test'

除了setup()需要先获得实例,其他地方可以直接通过$test使用:

<tempalte>
    <div>{{ $test }}</div>
</tempalte>
<script>
import { getCurrentInstance } from 'vue'

export default {
  setup() {
    const test = getCurrentInstance()?.appContext.config.globalProperties.$test
    console.log('test===') 
    console.log(test)
  },
}
</script>

Vite通过alias别名引用

webpack中,配置src的别名为@,可以这么写:

// 引用src/views/PageOne.vue
import PageOne from '@/views/PageOne.vue'

如果使用Vite,则需要做以下修改:

// vite.config.js
module.exports={
  alias: {
    '/@/': path.resolve(__dirname, './src'),
  },
}
// tsconfig.json
{
  "compilerOptions": {
    "paths": {
      "@/*": ["src/*"],
      "/@/views/*": ["src/views/*"]
    }
  }
}
import PageOne from '/@/views/PageOne.vue'

更加规范的props和emits

vue3中,父子组件传值的props和emits写法更加规范(命名更统一),体现在:

  1. v-model的变化
<template>
	<child-component v-model:value="myValue"></child-component>
</template>

v-model:value等同于props:'value'和emits('update:value')

  1. 需要指定emits

为了便于管理,建议在emits中定义所有用到的emit

 export default {
    emits: ['update:value', 'otherEmit'],
    setup(props, { emit }) {
      emit('update:value')
      emit('otherEmit')
    },
  }

跟踪attrs和slots

本来以为可以通过watch()函数直接watch(()=>attrs.xxx),结果是不行。这里官网有些,一开始自己没注意:

attrs 和 slots 是有状态的对象,它们总是会随组件本身的更新而更新。这意味着你应该避免对它们进行解构,并始终以 attrs.x 或 slots.x 的方式引用 property。请注意,与 props 不同,attrs 和 slots 是非响应式的。如果你打算根据 attrs 或 slots 更改应用副作用,那么应该在 onUpdated 生命周期钩子中执行此操作。

所以要响应式处理attrsslots,就需要:

import { onUpdated, reactive, watch, watchEffect } from 'vue'

export default {
  setup(props, { attrs }) {

    function _handleAttrsChange() {
      console.log('attrs===')
      console.log(attrs)
    }

    onUpdated(() => {
      _handleAttrsChange()
    })

    // props和data可以正常使用watch函数
    watchEffect(() => {
      console.log('propsXxx===')
      console.log(props.xxx)
    })
    const state = reactive({ count: 0 })
    watch(() => state.count, (now, old) => {
      //
    })
  },
}

VueRouter不能直接使用含有props的组件

我有一个地址列表AddressList,需要通过props接收父组件参数:

// router.js
export default {
  name: 'AddressList',
  props: {
    propName: String,
  },
}

通过组件调用,没有问题。但是配置为vue-router项时会报错:

export default {
  routes: [
    {
      path: 'address_list',
      component: () => import( 'AddressList.vue'),
    },
  ],
}

既然不能直接将组件作为route使用,那么就在其他页面中调用就好了

// router.js
export default {
  routes: [
    {
      path: 'address_list',
      component: () => import( 'Page.vue'),
      meta: { component: 'AddressList' },
    },
  ],
}
<!--Page.vue-->
<template>
	<component :is="component" />
</template>

<script lang="ts">
  import AddressList from '/@/views/AddressList.vue'
  import { defineComponent } from 'vue'

  export default defineComponent({
    name: 'Page',
    components: { AddressList },
    computed: {
      component () {
        return this.$route.meta.component
      },
    },
  })
</script>

觉得写得不错的话,请用你们发财的小手点个赞叭!


http://www.niftyadmin.cn/n/658224.html

相关文章

Leetcode 1013. Partition Array Into Three Parts With Equal Sum

简单题,暴力找出来就行. class Solution:def canThreePartsEqualSum(self, A: List[int]) -> bool:s sum(A)if s % 3 > 0:return Falses / 3size len(A)t 0a, b -1, -1for i in range(size):t A[i]if t s:a ibreakt 0for j in range(size - 1, -1, -1):t A[j]if…

javascript代码重构之:写好函数

1、函数要短小&#xff0c;一个函数只做一件事 如果函数做了较多的事情&#xff0c;它就难以组合、测试和推测。同时让函数只做一件事情的时候&#xff0c;它们就很容易重构。 // Bad functionshowStudent(ssn){ conststudent db. get (ssn); if (student ! null ){documen…

ORACLE UPDATE 语句语法与性能分析看法 [转]

update 作者:未知   ORACLE UPDATE 语句语法与性能分析的一点看法 为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中&#xff0c; --客户资料表 create table customers ( customer_id number(8) not null, -- 客户标示 cit…

推荐几个大厂的前端代码规范,你也能写出诗一样的代码!

前端代码规范 代码千万行&#xff0c;安全第一行&#xff1b;前端不规范&#xff0c;同事两行泪。 腾讯 腾讯 包含内容也挺多的&#xff1a; PC端专题&#xff1a;快速上手、文件目录、页面头部、通用title、通用foot、统计代码、兼容测试 移动端专题&#xff1a;快速上手…

又到了票贩子发一回的机会了

每到春节前后&#xff0c;凡是要出门的都会有同样的感受&#xff0c;那就是 火车票可真难买呀。我也是有亲身经历的。好像是&#xff10;&#xff14;年春节&#xff0c;我的两个亲戚要做初六的火车去上海&#xff0c;我去排队买票&#xff0c;售票员亲口告诉我&#xff0c;明…

推荐 7 个 Github 上近 200k Star 的计算机学习资源,练好前端内功的秘籍!

computer-science Star :58k Github 地址&#xff1a;https://github.com/ossu/computer-science 介绍&#xff1a;通往计算机科学免费自学教育之路&#xff01; OSSU课程是使用在线材料进行的完整的计算机科学教育。它不仅用于职业培训或专业发展。 它适用于那些希望对所…

vbscript下格式化时间和日期的函数

我们有时候遇到的日期格式可能是2004-1-12 ,系统自动将月份中的0去掉了&#xff0c;但是有时候我们需要完整的日期格式 &#xff0c;如&#xff1a;2004-01-12 那么怎么办呢&#xff1f;下面的几个函数可以轻松搞定。。。。。。 将一个一位的数字前面加零function FillZero…

JavaScript 中哪一种循环最快呢?

究竟哪一种循环更快&#xff1f; 答案其实是&#xff1a; for&#xff08;倒序&#xff09; 最让我感到惊讶的事情是&#xff0c;当我在本地计算机上进行测试之后&#xff0c;我不得不接受 for&#xff08;倒序&#xff09;是所有 for 循环中最快的这一事实。下面我会举个对一…