Vue3学习笔记 | 青训营笔记

222 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4天

今天自学了Vue3以及TS的一些基础知识

1.搭建项目vue3

 //全局安装脚手架
 npm i -g @vue/cli
 //创建一个名为project-name的vue3项目
 vue create project-name

项目特性(代码规范、测试等等)预设

image-20230116190726579

通过空格进行选中

image-20230116191028991

image-20230116192926576

2.代码格式化工具prettier

安装插件

image-20230116215600280

新建配置文件

image-20230116215648596

image-20230116220724452

修改vs设置

image-20230116220711961

设定编辑器默认代码格式化(美化)的插件为Prettier,同理在搜索设置框贴入editor.defaultFormatter,将配置项选择为Prettier。

3.组件定义Component

使用defineComponent()函数

一个简单的组件定义

image-20230117191758787

tips:如何提取props定义 as const*告诉TS这是一个ReaderOnly的对象

image-20230116232748365

4.复现Vue3的组件生成过程

 
 //main.ts
 //createApp创建App、defineComponent构建组件、h生成元素
 import { createApp, defineComponent, h } from 'vue'
 //引入HelloWorld组件
 import HelloWorld from './components/HelloWorld.vue'
 //eslint格式下导入图片地址
 const img = require('./assets/logo.png') //eslint-disable-line
 //创建App的组件
 const App = defineComponent({
   render() {
     return h('div', { id: 'app' }, [
       h('img', {
         alt: 'VueLogo',
         src: img,
       }),
       h(HelloWorld, {
         msg: 'Welcome to Your Vue.js + TypeScript App',
         age: 18,
       }),
     ])
   },
 })
 //挂载到id为app的元素上,作用到App.vue上
 createApp(App).mount('#app')
 //HelloWorld.vue
 ​
 <template>
   <div class="hello">
     {{ age }}
   </div>
 </template>
 ​
 <script lang="ts">
 import { defineComponent } from 'vue'
 ​
 //接收参数
 const PropsType = {
   msg: String,
   age: {
     type: Number,
     required: true,
   },
 }
 ​
 export default defineComponent({
   name: 'HelloWorld',
   props: PropsType,
 })
 </script>
 ​
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style scoped>
 /*h3 {
   margin: 40px 0 0;
 }
 ul {
   list-style-type: none;
   padding: 0;
 }
 li {
   display: inline-block;
   margin: 0 10px;
 }
 a {
   color: #42b983;
 }*/
 </style>
 //App.vue
 ​
 <template>
     //此时由main.ts中的组件生效,看下图数字就知道(18是main.ts中定义的)
   <!--<img alt="Vue logo" src="./assets/logo.png" />
   <HelloWorld msg="Welcome to Your Vue.js + TypeScript App" v-bind:age="13" />-->
 </template>
 ​
 <script lang="ts">
 import { defineComponent } from 'vue'
 import HelloWorld from './components/HelloWorld.vue'
 ​
 export default defineComponent({
   name: 'App',
   components: {
     HelloWorld,
   },
 })
 </script>
 ​
 <style>
 /*create(App).mount(#app)被作用的位置,也可以在html中创建一个元素进行挂载*/
 #app {
   font-family: Avenir, Helvetica, Arial, sans-serif;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
   text-align: center;
   color: #2c3e50;
   margin-top: 60px;
 }
 </style>

5.createVNode

 //main.ts
 //createApp创建App、defineComponent构建组件、h生成元素
 import { createApp, defineComponent, createVNode } from 'vue'
 //引入HelloWorld组件
 import HelloWorld from './components/HelloWorld.vue'
 //eslint格式下导入图片地址
 const img = require('./assets/logo.png') //eslint-disable-line
 //创建App的组件
 const App = defineComponent({
   render() {
     return createVNode('div', { id: 'app' }, [
       createVNode('img', {
         alt: 'VueLogo',
         src: img,
       }),
       createVNode(HelloWorld, {
         msg: 'Welcome to Your Vue.js + TypeScript App',
         age: 18,
       }),
     ])
   },
 })
 //挂载到id为app的元素上,作用到App.vue上
 createApp(App).mount('#app')

将h函数换成createVNode一样有效,h函数是对createVNode的判断封装

image-20230118090843294

6.watchEffect

 //值变化后watchEffect调用的函数都会重新执行
 watchEffect(() => {
     console.log(nameRef.value)
 })

7.在TS中使用setup()

image-20230118222641908

通过闭包的特性:子级作用域可以调用父级作用域的所有变量

注意:可重复执行变量要定义在return() =>{里面} 这样才能重新渲染DOM树,因为setup()函数只会在初始化时执行一次

总结setup() :return的变量在写模板时可以直接使用,setup只有初始化会执行,return()/watchEffect()会在变量发生变化时执行值变化后重新执行