2-3-2 Vue3 整体解读

Posted 沿着路走到底

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2-3-2 Vue3 整体解读相关的知识,希望对你有一定的参考价值。

Vue3可以说对vue的程序应该如何写,重新下了定义:

- JSX

- Typescript

- Composition API

- reativity

在`SFC` 中你需要写`template` 和`script` 标签,这个方式有两个缺点:

- 这样的设计不够灵活

- 需要v-show/v-if/v-for等(用户可以少记忆东西)

- 关注点被分离(模板也好、script也好,都是解决某个关注点的一部分,在SFC中被强行分离了)。你可以思考一个template和script都很长的场景。

- TS的类型检查

- 函数组件可以最大程度复用TS的类型检查(比如检查属性)

我们来看一个`vue` 的计数器程序:

参考文件:Counter.tsx

function useCounter() : [Ref<number>, () => void]
	const counter = ref(0) 

	function increment()
		counter.value ++
	

	return [counter, increment]


export default 
	setup() 
		const [counter, increment] = useCounter()
		return () => <div>
			count is : counter.value
			<button onClick=increment>add</button>
		</div>
	

从这个程序你看到了什么?

- counter逻辑的集中管理

- 强大的封装能力

- 少量的记忆要求

cmposition API

Composition AP是一系列函数式API的合集。


有用来初始化、定义组件的:

- setup

- defineComponent

有支持响应式数据的:

- ref

- reactive

- toRefs

- computed

- watch

- watchEffect

有支持生命周期管理的:

- onMounted

- onUnmounted


总体来说, Composition API

- 提升了组合能力(自定义的Composition API)

- 提供了Reactive Programming

- 提供了函数式(简化API设计)

Reactivity

Reactivity 是Vue3提供的核心能力,配合函数式的Composition API使用非常方便。

响应式编程是什么?

Reactive Programming——让类型自发的响应环境的变化。

Reactive :

一个值是Reactive,那么这个值可以被监听;一个对象是Reactive,那么这个对象可以被监听。一个函数是Reactive,那么这个函数在提供Reactive的能力,比如去创造一个Reactive的值或者对象。

Be Reactive

让程序变得Reactive是很好的一个思路。程序如果不是Reactive,那么往往是Passive(被动的)。响应的反义词为什么是被动? 因为Reactive代表一部分程序(类型)主动的去通知周边自己做了什么,另一部分类型主动监听变化,主动做出判断并完成操作。

程序变得Reactive之后,每个模块好像活了一样,不需要程序员主动的下指令,而是程序自己主动完成工作。——从这个角度看Reactive的反义词就是Passive。

声明式(Declarative)

Reactive的程序往往是声明式的。所谓声明式,就是程序员的声明要做什么?不要做什么?而不是写一大堆计算逻辑。

首先声明式需要更好的封装:

const arr = []
for(let i = 0 ; i < 10000; i++)

    arr[i] = i


// 声明式
const arr = range(0, 10000)

第二:声明式会创造语言

const div = document.createElement('div')
div.style.width = 100

// 声明式
const div = <div style=width : 100 />

第三:声明式往往是Reactive

import userStore from './userStore'

export default 
	setup() 
		const logined = ref(userStore.logined())
    
    userStore.on(e) 
        switch(e.type) 
            case "logined":
                logined.value = true
                break
            case "logout":
                logined.value = false
                break
        
            
    
		return () => 
        if(logined.value) 
            return <div>您好!欢迎光来临</div>
        
        else 
            return <div>请登录……</div>
        

    
	

上面程序中组件在响应全局用户状态的变化,这样就将组件和全局状态(userStore)解耦:

- 组件迭代不用关心userStore迭代

- userStore迭代(甚至有新的版本),组件不需要调整

上面代码可以做优化,就实现了业务逻辑和组件的强分离:

function useLoginStatus()
   	const logined = ref(userStore.logined())
    
    userStore.on(e) 
        switch(e.type) 
            case "logined":
                logined.value = true
                break
            case "logout":
                logined.value = false
                break
                        
    
    
    return logined.value

export default 
	setup() 
		const loggedIn = useLoginStatus()
		return () => <LogginStatus />
	


const LogginStatus = (loggedIn) => 
    if(loggedIn) 
        return <div>您好!欢迎光来临</div>
    
    else 
        return <div>请登录……</div>
    

当然还有一个很大的好处就是声明式帮助我们更好的阅读代码。

最后也式最重要的、哲学高度的思考:Reactive让程序模块自己懂得如何做事。

1

以上是关于2-3-2 Vue3 整体解读的主要内容,如果未能解决你的问题,请参考以下文章

Vue3.0 解读

Vue2升级到Vue3到底是不是一个正确的选择?(尤雨溪亲自回复解读)

Vue2升级到Vue3到底是不是一个正确的选择?(尤雨溪亲自回复解读)

Vue3 v-for中无key和有key实现的简单解读

Vue3.0 简介以及基本使用

Vue3.0入门:基本使用以及vue的调试工具