# 第8章 通行凭证 - 权限管理

# 8-1 登录第一部分 获取token

代码提交详情:https://git.imooc.com/coding-449/zheye/commit/9d1623642c664693a08cdb460b43a1cb07a0618c

# 8-2 JWT 的运行机制

JWT 以及 Session 的运行原理图 JWT 以及 Session 的运行原理图

JWT 的官方网站,可以去试试看:https://jwt.io/

# 8-3 登录第二部分 axios 设置通用 header

Axios Default Header 设置的文档:https://axios-http.com/docs/config_defaults

// 示例代码
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

代码提交详情:https://git.imooc.com/coding-449/zheye/commit/329405426a98a88b318291fb62b477c4757bd6a6

# 8-4 登录第三部分 持久化登录状态

LocalStorage 文档地址:https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage

注意这里为什么不选择 Cookie?

代码提交详情:https://git.imooc.com/coding-449/zheye/commit/d19af252da94f16f057c24e526c03f5ec29d1dca

# 8-5 通用错误处理

Axios 拦截器的文档地址:https://axios-http.com/docs/interceptors

示例代码:

// Add a request interceptor
axios.interceptors.request.use(function (config) {
    // Do something before request is sent
    return config;
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });

// Add a response interceptor
axios.interceptors.response.use(function (response) {
    // Any status code that lie within the range of 2xx cause this function to trigger
    // Do something with response data
    return response;
  }, function (error) {
    // Any status codes that falls outside the range of 2xx cause this function to trigger
    // Do something with response error
    return Promise.reject(error);
  });

代码提交详情: https://git.imooc.com/coding-449/zheye/commit/d55345cee5af5c80557650fa490974a2fd313824

# 8-6 创建 Message 组件 8-7 Message 组件改进为函数调用形式

代码提交详情:https://git.imooc.com/coding-449/zheye/commit/9d5e0af1f28271bbabcdda50a3897484df77712b

关于 Vue createApp 实例相关的文档地址:https://v3.cn.vuejs.org/api/application-api.html#component

# 8-8 了解 Vnode 以及 vue 的简单工作原理

文档地址:https://vuejs.org/guide/extras/rendering-mechanism.html#virtual-dom

Virtual DOM:一种虚拟的,保存在内存中的数据结构,用来代表 UI 的表现,和真实 DOM 节点保持同步。Virtual DOM是由一系列的 Vnode 组成的。

// 模拟一个简单的 Vnode
const vnode = {
  type: 'div',
  props: {
    id: 'hello'
  },
  children: [
    /* more vnodes */
  ]
}

# Render Pipeline

  • Compile, Vue 组件的 Template 会被编译成 render function,一个可以返回 Virtual DOM 树的函数。
  • Mount,执行 render function,遍历虚拟DOM 树,生成真正的 DOM 节点。
  • Patch,当组件中任何响应式对象(依赖)发生变化的时候,执行更新操作 。生成新的虚拟节点树,Vue 内部会遍历新的虚拟节点树,和旧的树做对比,然后执行必要的更新。

虚拟DOM 的优点

  • 可以使用一种更方便的方式,供开发者操控 UI 的状态和结构,不必和真实的DOM 节点打交道。
  • 更新效率更高,计算需要的最小化操作,并完成更新。

# 看一下 Render Functions

// 在 main.ts 中
console.log(App)
// 返回
Object
  components: {HelloWorld: {}}
  name: "App"
  render: ƒ render(_ctx, _cache, $props, $setup, $data, $options)
  setup: ƒ ()
// 原始的 template
<template>
  <HelloWorld msg="axyz"/>
  {{ hello }}
</template>

// template 会被转换成这样的 function
  const _component_HelloWorld = _resolveComponent("HelloWorld")!

  return (_openBlock(), _createElementBlock(_Fragment, null, [
    _createVNode(_component_HelloWorld, { msg: "axyz" }),
    _createTextVNode(" " + _toDisplayString(_ctx.hello), 1 /* TEXT */)
  ], 64 /* STABLE_FRAGMENT */))
  • Template 比 render function 更接近 html,更好懂,更容易修改。
  • Template 更容易做静态优化,Vue 的 compiler 在编译过程中可以做很多自动的性能优化。

在实践中,templates适应大多数的情况,但是在少数情况下,还是需要学习使用 render function。因为它本身是 javascript 语法,要更灵活多变。Vue 提供对应的 API 可以不使用 templates,而是直接使用 render function。

# 8-9 创建 Vnode 以及使用 render function

# 创建 Vnode

h 和 createVnode 都可以创建 vnode,h 是 hyperscript 的缩写,意思就是 “JavaScript that produces HTML (hypertext markup language)”,很多 virtualDOM 的实现都使用这个函数名称。还有一个函数称之为 createVnode,更形象,两个函数的用法几乎是一样的。

import { h, createVnode } from 'vue'

const vnode = h(
  'div', // type
  { id: 'foo', class: 'bar' }, // props
  [
    /* children */
  ]
)

# 声明 Render Function

当使用 composition API 的时候,在 setup 当中直接返回一个对象,代表着给模版使用的数据,当要使用 render function 的时候,可以直接返回一个函数。

setup() {
  const message = ref(1)
  // 使用 template
  return {
    message
  }
  // 使用 render function
  return () => {
    return h('div')
  }
}

使用 JSX

JSX 是一种类似XML 的语法,如果大家使用过 React 对它应该特别熟悉。它就是 h 函数的一种语法糖。可以将这种类似 HTML 的语法转换成 h 函数的写法。

// 创建 vnode
const vnode = <div>hello</div>
// 使用变量
const vnode = <div id={dynamicId}>hello, {userName}</div>

添加 JSX 支持

vue add babel