创建项目

1、vite模板创建

https://vitejs.dev/guide/#scaffolding-your-first-vite-project

  • npm
  1. npm init vite@latest
  • yarn
  1. yarn create vite

doc-vite-vue-ts-init.jpg
选择Vue并选择使用TypeScript

也可以直接指定对应的模板来初始化

  1. yarn create vite vite-app-vue --template vue-tsc

2、vue cli创建

https://cn.vuejs.org/guide/quick-start.html#with-build-tools

  1. npm init vue@latest

使用官方vue cli可以提供给你对于TypeScriptESLintVitest之类的可选支持

  1. Vue.js - The Progressive JavaScript Framework
  2. Project name: web-vue
  3. Add TypeScript? No / Yes
  4. Add JSX Support? No / Yes
  5. Add Vue Router for Single Page Application development? No / Yes
  6. Add Pinia for state management? No / Yes
  7. Add Vitest for Unit Testing? No / Yes
  8. Add Cypress for End-to-End testing? No / Yes
  9. Add ESLint for code quality? No / Yes
  10. Add Prettier for code formatting? No / Yes
  11. Scaffolding project in /Users/forguo/work/wei-design/web-vue...
  12. Done. Now run:
  13. cd web-vue
  14. npm install
  15. npm run lint
  16. npm run dev

如果为了省事,使用vue-cli即可,就不用后面再去配置ESLintPrettier
eslint + prettier 配置


项目结构

image.png

组件定义

defineComponent

props定义

  1. {
  2. type: {
  3. type: String as PropType<string>, // 转为ts类型string
  4. default: 'default',
  5. }
  6. }

h函数

使用

  1. h(
  2. // 原生标签名
  3. 'div',
  4. {
  5. // div节点属性/props传递
  6. class: 'vue3-app'
  7. }, [
  8. // 传入子组件
  9. h('img', {
  10. src: 'https://forguo.cn'
  11. })
  12. ])

createVNode的封装

setup

  1. export default defineComponent({
  2. name: 'com',
  3. props: {
  4. name: {
  5. type: String as PropType<string>,
  6. retuired: true,
  7. }
  8. },
  9. setup: (props, {slots, attrs, emit}) => {
  10. }
  11. })

响应式

ref

接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value。
响应式渲染不需要value
一般用于简单值的响应式

shallowRef

只有对.value 的访问是响应式的

reactive

返回一个对象的响应式代理。
深层次的响应式转换

若要避免深层响应式转换,只想保留对这个对象顶层次访问的响应性,请使用 shallowReactive()作替代。

watchEffect

用于监听里面所使用到的变量的变化