RESTful

全称

REpresentational State Transfer 表征性状态转移

特点

  • 无状态
  • 面向 “资源”,URL里只有名词没有动词
  • 使用HTTP的动词
    • GET 查看
    • POST 创建
    • PUT 更新
    • PATCH 部分更新
    • DELETE 删除
  • HATOAS 超媒体即应用状态引擎

适用性

  • 面向资源好用,如增删改查
  • 面向过程不好用,如登录

Axios的使用

发音

/æk’siəʊ:s/

优点

  • 简单易用,API接近于jQuery, 比原生的fetch简单
  • 浏览器兼容性好,能兼容IE7, 使用fetch就得自己处理兼容
  • 通用性好,能在node和浏览器中使用,api一致

安装

  1. yarn add axios

在类组件中使用

异步请求应放在 componentDidMount阶段

  1. import axios from 'axios'
  2. interface State {
  3. productList: any[]
  4. }
  5. class HomePageComponent extends React.Component<WithTranslation, State> {
  6. constructor(props){
  7. super(props)
  8. this.state = {
  9. productList: []
  10. }
  11. }
  12. async componentDidMount(){
  13. const {data} = await axios.get('/api/productCollections')
  14. this.setState({productList: data})
  15. }
  16. render() {
  17. // ...
  18. }
  19. }

处理数据悬空状态

因为数据是在componentDidMount阶段才请求的,当生成虚拟DOM时,render函数已经执行了,此时会因为没有数据而报错, 解决办法

  • 使用loading标志,数据未加载则显示动画,
  • 使用error标志,请求数据失败则显示错误信息 ```tsx import { Spin } from ‘antd’ import axios from ‘axios’

interface State { loading: boolean, error: string | null productList: any[], }

class HomePageComponent extends React.Component { constructor(props){ super(props) this.state = { loading: true, error: null, productList: [] } }

async componentDidMount(){ try { const {data} = await axios.get(‘/api/productCollections’) console.log(data) this.setState({ loading: false, error: null, productList: data }) }catch(error: any) { this.setState({ error: error.message, loading: false }) }

}

render() { const { t } = this.props const {productList, loading, error} = this.state if(loading) { console.log(‘loading: true’) return }

  1. if(error) {
  2. return <div>网站出错: {{error}}</div>
  3. }

return ( // … ) } ```

什么是MVC?

MVC是一种架构模式,也是一种思想,用于分离数据模型、UI显示和逻辑控制

  • M(model)
  • V(view)
  • C(controller)

React不提倡使用MVC,MVC会造成数据双向绑定,React是MVVM