Vuex为我们提供了大概以下几个功能:
-
集中式存储管理应用的「所有组件」的「状态」
-
保证状态以「可预测」的方式「发生变化」
-
与调试工具集成,提供功能:time-travel、状态快照导入导出
共享状态必须符合两个条件:
响应式:当状态改变时,使用它们的组件也应更新
可用性:可以在任何组件中访问状态
在VUE3中,其为我们提供了更加轻量化的ref,reactive响应式方法。
Common.ts
// 公共状态文件:替代VUEX
import { reactive } from 'vue';
/**
* @name: 全局状态显示
* @author: camellia
* @email: guanchao_gc@qq.com
* @date: 2021-01-23
*/
export const common = reactive({
// 测试全局状态
glabl: 0 ,
// 自定义loading组件
loading:true,
// 回到顶部是否显示
topShow:false,
// 聊天抽屉是否显示
drawerShow:false,
// 搜索字符串
search:'',
// 菜单显示标识(is_menu,is_search,is_login)
menuSign:'is_menu',
// 当前网页url
currectUrl:'',
});
Draw.ts
注意引入及使用common.ts那部分代码
import { useRouter } from "vue-router";
import {
PropType,
ref,
watch,
reactive,
toRefs,
inject,
provide,
onMounted
} from "vue";
import { common } from "/@/hooks/common.ts";
// 引入公共js文件
import utils from "/@/assets/js/public/function";
// 定义返回的类型
interface dataRef {
close: () => void;
}
export default {
name: "Drawer",
// VUE3语法 setup函数
// setup官方文档:https://www.vue3js.cn/docs/zh/guide/composition-api-setup.html#参数
setup(props: any, content:any): dataRef
{
const router = useRouter();
/**
* @name: 监听公共状态栏值变化
* @author: camellia
* @email: guanchao_gc@qq.com
* @date: 2021-01-10
*/
watch(
() => common.drawerShow,
() => {
data.drawerShow = common.drawerShow;
}
);
/**
* @name: 声明data
* @author: camellia
* @email: guanchao_gc@qq.com
* @date: 2021-01-10
*/
const data = reactive({
drawerShow: common.drawerShow,
});
/**
* @name: 关闭组件
* @author: camellia
* @email: guanchao_gc@qq.com
* @date: 2021-01-10
*/
const close = () => {
data.drawerShow = false;
common.drawerShow = data.drawerShow;
}
/**
* @name: 将data绑定值dataRef
* @author: camellia
* @email: guanchao_gc@qq.com
* @date: 2021-01-10
*/
const dataRef = toRefs(data);
return {
close,
...dataRef
}
},
}
想上边的例子,只要在你要使用公共状态的地方引入common.ts,那么你就可以访问到common.ts中我们定义的变量中的值,就是共享状态。
VUE3中标还为我们提供了provide、inject依赖注入功能。
import { provide, inject } from 'vue'
const ThemeSymbol = Symbol()
const Ancestor = {
setup() {
provide(ThemeSymbol, 'dark')
}
}
const Descendent = {
setup() {
const theme = inject(ThemeSymbol, 'light' /* optional default value */)
return {
theme
}
}
}
这是怎么注入的呢?我们还是看图来说话:
我们都知道 Vue 是一颗「组件树」,我们只要保证是「父节点」 provide,那么它的「子节点」就一定可以通过 inject 获取到。
举例:
A provide,B 可以 inject,C 可以 inject,D 可以 inject
B provide,D 可以 inject
D provide,没有其它节点可以 inject
C provide,没有其它节点可以 inject