2022年10月19日 优化 2022年11月2日 优化

Vue 架构图

一个标准的vuejs平台要跑起来的逻辑

[vuejs] 理解和逻辑 - 图1

vue的基础能力。组件功能和组件通信;状态、行为和生命周期

父子组件数据传递和交互

[vuejs] 理解和逻辑 - 图2

Vue Router 路由

  1. // 1. 定义路由组件.
  2. // 也可以从其他文件导入
  3. const Home = { template: '<div>Home</div>' }
  4. const About = { template: '<div>About</div>' }
  5. // 2. 定义一些路由
  6. // 每个路由都需要映射到一个组件。
  7. // 我们后面再讨论嵌套路由。
  8. const routes = [
  9. { path: '/', component: Home },
  10. { path: '/about', component: About },
  11. ]
  12. // 3. 创建路由实例并传递 `routes` 配置
  13. // 你可以在这里输入更多的配置,但我们在这里
  14. // 暂时保持简单
  15. const router = VueRouter.createRouter({
  16. // 4. 内部提供了 history 模式的实现。为了简单起见,我们在这里使用 hash 模式。
  17. history: VueRouter.createWebHashHistory(),
  18. routes, // `routes: routes` 的缩写
  19. })
  20. // 5. 创建并挂载根实例
  21. const app = Vue.createApp({})
  22. //确保 _use_ 路由实例使
  23. //整个应用支持路由。
  24. app.use(router)
  25. app.mount('#app')
  26. // 现在,应用已经启动了!

router-link
请注意,我们没有使用常规的 a 标签,而是使用一个自定义组件 router-link 来创建链接。这使得 Vue Router 可以在不重新加载页面的情况下更改 URL,处理 URL 的生成以及编码。我们将在后面看到如何从这些功能中获益。

router-view
router-view 将显示与 url 对应的组件。你可以把它放在任何地方,以适应你的布局。

Pinia 状态管理

Store是什么?

Store(如 Pinia)是一个保存状态和业务逻辑的实体,它并不与你的组件树绑定。换句话说,它承载着全局状态。它有点像一个永远存在的组件,每个组件都可以读取和写入它。它有三个概念,state、getters 和 actions,我们可以假设这些概念相当于组件中的 data、 computed 和 methods。

应该在什么时候使用 Store?

一个 Store 应该包含可以在整个应用程序中访问的数据。这包括在许多地方使用的数据,例如显示在导航栏中的用户信息,以及需要通过页面保存的数据,例如一个非常复杂的多步骤表单。
另一方面,你应该避免在 Store 中引入那些原本可以在组件中保存的本地数据,例如,一个元素在页面中的可见性。
并非所有的应用程序都需要访问全局状态,但如果你的应用程序确实需要一个全局状态,Pinia 将使你的开发更轻松。

创建一个 pinia 实例(根 store)并将其传递给应用程序:

  1. import { createApp } from 'vue'
  2. import { createPinia } from 'pinia'
  3. import App from './App.vue'
  4. const pinia = createPinia()
  5. const app = createApp(App)
  6. app.use(pinia)
  7. app.mount('#app')

定义一个 Store:

  1. import { defineStore } from 'pinia'
  2. // 你可以对 `defineStore()` 的返回值进行任意命名,但最好使用 store 的名字,
  3. // 同时以 `use` 开头且以 `Store` 结尾。(比如 `useUserStore`,`useCartStore`,
  4. // `useProductStore`)
  5. // 第一个参数是你的应用程序中 Store 的唯一 ID。
  6. export const useStore = defineStore('main', {
  7. // 其他配置...
  8. })
  9. // Option 对象
  10. export const useCounterStore = defineStore('counter', {
  11. state: () => ({ count: 0 }),
  12. getters: {
  13. double: (state) => state.count * 2,
  14. },
  15. actions: {
  16. increment() {
  17. this.count++
  18. },
  19. },
  20. })
  21. // Setup 函数
  22. export const useCounterStore = defineStore('counter', () => {
  23. const count = ref(0)
  24. function increment() {
  25. count.value++
  26. }
  27. return { count, increment }
  28. })
  29. // ref() 就是 state 属性
  30. // computed() 就是 getters
  31. // function() 就是 actions

(完)