guqzhou guqzhou
首页
快捷导航
下载站
  • Html 篇
  • Javascript 基础篇
  • 框架

    • Vue2
  • 前端文章

    • Css 篇
    • 微信开发
    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
    • JavaScript 基础
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 面试题库

    • HTML
    • CSS
    • jQuery
    • Vue
    • 零碎
  • 面试心得

    • 杂言碎语
  • 摘抄收录

    • ☆ 励志鸡汤
    • ❀ 人间烟火
    • ☣ 万物沦丧
    • ✌ 关掉烦恼
    • ✲ 小酒馆
  • 读书笔记

    • 《小狗钱钱》
    • 《穷爸爸富爸爸》
    • 《聪明人使用方格笔记本》
关于
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue资源
  • 主站CDN
  • Vercel
  • Netlify
  • Github
GitHub

guqzhou

喜欢所以去追求!
首页
快捷导航
下载站
  • Html 篇
  • Javascript 基础篇
  • 框架

    • Vue2
  • 前端文章

    • Css 篇
    • 微信开发
    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
    • JavaScript 基础
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 面试题库

    • HTML
    • CSS
    • jQuery
    • Vue
    • 零碎
  • 面试心得

    • 杂言碎语
  • 摘抄收录

    • ☆ 励志鸡汤
    • ❀ 人间烟火
    • ☣ 万物沦丧
    • ✌ 关掉烦恼
    • ✲ 小酒馆
  • 读书笔记

    • 《小狗钱钱》
    • 《穷爸爸富爸爸》
    • 《聪明人使用方格笔记本》
关于
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue资源
  • 主站CDN
  • Vercel
  • Netlify
  • Github
GitHub
  • vue2
  • CSS

  • Javascript基础

  • javascript进阶

  • typeScipt

  • vue2

  • vue3

    • vue3简介
    • 创建vue3工程
    • composition API
    • vue + ts之旅
    • provide与inject的用法
    • vuex的使用
    • vue3学习
      • ref
      • reactive
      • toRef、 toRefs、 toRaw
      • watch监听器
    • vue3+ts 源码学习
    • watch的用法
    • watchEffect
    • v-model介绍
    • vite3 + js 迁移ts过程
    • vue3自定义指令的使用
    • VueDraggable的使用
  • react

  • vue实战

  • pinia的使用

  • gis

  • 前端文章

  • JavaScript文章

  • Vue文章

  • 小程序开发文章

  • uni-app

  • 学习笔记

  • TaroUI的使用

  • 工具使用

  • 前端
  • vue3
guqzhou
2023-03-25
0

vue3学习

##书写风格

# vue2 中的 optiond api

    <script>
     export default {
        data () {
            return {
                name: '刘德华'
            }
        },
        methods: {
            xxx() {
            
            }
        }
    }
    </script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# vue3中的setup函数模式

定义的变量和方法都必须手动return出去,比较麻烦

<template>
  <div>{{ a }}}</div>
</template>
<script>
    export default {
        setup() {
            const a = 3
            return {
              a
            }
        }       
    }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13

# vue3 setup语法糖模式

<template>
    ## 插值模板语法
    <div>{{ a }}}</div>
  
    ## 支持模板运算
    <div>{{ a + 2 }}</div>
  
    ## 三元表达式
    <div>{{ a ? 'true' : 'false' }}</div>
  
    ## api运算
    <div>{{ b.map(v => ({ num: v })) }}</div>
  
    ## v-text
    <div v-text="c"></div>
  
    ## v-html解析标签但是不支持组件
    <div v-html="d"></div>
    ## v-if  、  v-show 、 v-else 、v-else-if
    <div v-if="e"></div>
  
    ## 事件v-on @click 动态的事件切换@[event]
    <div @click="xxx"></div>
    <div @[event]="xxx"></div>
  
    ## 事件冒泡.stop、.prevent、.onece只执行一次
    <div  @[event]="parent">
        <div @click.stop="son"></div>
    </div>
  
    ## v-bind绑定属性 :id
    <div v-bind:id="id"></div>
    ## 绑定style
    <div :style="style"></div>
    ## 绑定class
    <div :class="['box1','box2']"></div>
    <div :class="[ c ? 'box1' : 'box2' ]"></div>
  
    ## v-model 绑定表单元素的
    <input v-model="f"></input>
  
    ## v-for遍历 嵌套
    <div v-for="item in g"></div>
  
    ## v-once 只渲染一次  v-memo="[item == 2]"
    
</template>
<script setup lang="ts">
  import { ref } from 'vue'
    const a:number = 1
    const b:number[] = [1,2,3,4,5]
    const c:string = '我是v-text'
    const d:string = '<section>我是v-html</section>'
    const e:boolean = true
    const event = 'click'
    const xxx = () => {
      console.log('点击了')
    }
    const parent = () => {
      console.log('我是父级')
    }
    const son = () => {
      console.log('我是子级')
    }
    
    const id:string = '22'

    const style = {
      color: 'red',
      fontSize: '18px'
    }
    
    const value:string = '666'

    const f = ref('响应式')

    const g:string[] = ['小满'、'大满']
</script>
<style scoped lang="scss">
  .box1 {
    color: bule
  }
  .box2 {
    color: red
  }
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

# ref

<template>
  <div @click="change">修改</div>
  ## 读取dom
  <div ref="dom">我是dom</div>
</template>
<script setup lang="ts">
  import { ref, isRef, shallowRef, customRef } from 'vue'
  import type { Ref } from 'vue'
  type M = {
    name: string
  }
  ## 类型比较简单
  const Man = ref<M>({name: '刘德华' })
  
  ## 类型比较复杂
  const Man:Ref<M> = ref({ name: '刘德华' })
  
  ## 直接做一个类型推导
  const Man= ref({ name: '刘德华' })
  
const change = () => {
    Man.value.name = '张学友'
//    
  console.log(isRef(Man))  // true || false
}

// shallowRef 浅层次的 ref和shallowRef 不能混用
  
// 自定义一个ref
function myRef<T>(value: T) {
    return customRef((track,trigger) => {
      return {
        get() {
          // 收集依赖
          track()
          return value
        },
        set(newValue) {
          // 触发依赖
          value = newValue
          trigger()
        }
      }
    })
}

// 读取dom元素
const dom = ref<HTMLDivElement>()
console.log(dom.value?.innerHTML)
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

# reactive

ref支持所有的不类型,而reactive 只支持引用类型 Array、Object、Map、Set
鼠标移上去可以手动检测
ref取值跟赋值都要加.value 而reactive是不需要.value

reactive 不能直接赋值,否则会破坏响应式对象
解决方法:1.数组可以用push + 结构赋值 2.添加一个对象 把数组当作一个属性去解决

<template>
  <div v-for="item in list"></div>
  <button @click="add">添加</button>
</template>
<script lang="ts" setup>
import  { reactive, readonly, shallowReactive } from 'vue'
type M = {
  name: string,
  age: number
}

let form = reactive<M>({
  name: '刘德华',
  age: 14
})


// 方式一
let list = reactive<string[]>([])

// 方式二  list.arr
let list = reactive<{
  arr: string[]
}>({ arr: [] })


const add = () => {
  setTimeout(() => {
    // 处理异步
    let res = ['edg','fff','gtg']
    list = res // 不能赋值
    list.push(...res) // 用结构赋值
    
  //  方式二
    list.arr = res
    
  },2000)
  list.push{'sss'}
  
}

// readonly 把reactive当作只读  它是会受reactive 的影响
let obj = reactive({ name: '刘德华'})
const read = readonly(obj)

</script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# toRef、 toRefs、 toRaw

toRef只能修改响应式对象的值 非响应式视图毫无变化 应用场景:

<template></template>
<script lang="ts" setup>
  const man = { name: '刘德华', age: 14, like: 'music'}
  const like = toRef(man, 'like')
  useDemo(toRef(man, 'like')) // 函数 属性解出来赋值给一个函数
</script>
1
2
3
4
5
6

# watch监听器

<template>
  <input v-model="message"></input>
</template>
<script setup lang="ts">
import  { ref , reactive, watch } from 'vue'

let message = ref<string>({
  name: {
    bar: '444'
  }
})

watch([message,message2], (newValue, oldValue) = > {
  console.log(newValue, oldValue)
},{
  deep: true
})

</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
上次更新: 2023/03/26, 23:03:00
vuex的使用
vue3+ts 源码学习

← vuex的使用 vue3+ts 源码学习 →

最近更新
01
面向对象
01-05
02
typescript用localStorage封装过期时间
01-05
03
npm、pnpm、yarn删除文件缓存
12-14
更多文章>
Theme by Vdoing | Copyright © 2021-2024 guqzhou | 萌ICP备20238188号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式