json-server接口 和 setState

yarn add axios

npx json-server ./data.json --port 8888 --watch

data-json写入数据

import { Component } from "react";
import axios from "axios";

const http=axios.create({
  baseURL:'http://localhost:8888'
})
class Parent extends Component{
  state={
    lis:[],
    tabs:[]
  }
 async componentDidMount(){
  const tabs=await http.get('/tabs')
  const lis=await http.get('/lis')
  this.setState({lis:lis.data,tabs:tabs.data})
 }
  render(){
    console.log(this.state);
    return (
      <div>我是parent组件</div>
    )
  }
}
export default Parent

setState

1、延迟更新(非异步)

react框架内部有一个表示批量更新的标记isBatchingUpdates
当我们点击按钮时触发了react自己的事件后,这个标记就会被修改为true,表示批量更新
所有此时调用setState的时候,并不会立即更新状态,而是储存到一个队列中
将来等到所有的操作都执行完成后,React就会合并所有的状态更新,一次性的更新状态
最终,将isBatchingUpdates标记设置为false

2、setState(prevState=>{return prevState上一步操作后的结果})

3、setState(prevState=>{return prevState上一步操作后的结果},()=>{数据会直接更新})

4、setState在react生命周期或者处理程序中,里面表现异步合并更新,在setTimeout、setInterval及自己写的原生js中表现同步更新

import { Component } from 'react'
import ReactDOM from 'react-dom'

class Parent extends Component {
  state = {
    count: 0,
  }
  handleClick = () => {
    // react框架内部有一个表示批量更新的标记isBatchingUpdates
    // 当我们点击按钮时触发了react自己的事件后,这个标记就会被修改为true,表示批量更新
    // 所有此时调用setState的时候,并不会立即更新状态,而是储存到一个队列中
    // 将来等到所有的操作都执行完成后,React就会合并所有的状态更新,一次性的更新状态
    // 最终,将isBatchingUpdates标记设置为false
    // 三个一起写会进行覆盖  最后count是6
    // this.setState({count:this.state.count+2})
    // this.setState({count:this.state.count+4})
    // this.setState({count:this.state.count+6})


    // 注意:这种情况下,每次调用setState都会立即更新状态,并且让组件重新渲染
    // 因为 定时器 中的代码时异步代码,定时器中的代码不会立即执行而是放到了事件队列中
    // 事件队列的代码,会在js主线程都执行完成后,再执行
    // 当主线程中的代码执行完成后,React已经将isBatchingUpdates标记设置为false
    // 此时,再调用setState(),此时,因为批量合并更新的标记已经是false
    // 所以,React会调用一次setState就会立即更新一次状态,并且立即渲染

    // 三个一起写会进行相加  prevState拿到的是先前操作的state  最后count是9
    // this.setState((prevState)=>{
    //   return {count:prevState.count+1}
    // })
    // this.setState((prevState)=>{
    //   return {count:prevState.count+3}
    // })
    // this.setState((prevState)=>{
    //   return {count:prevState.count+5}
    // })

    // setState还有一个回调函数,在这个回调里面可以同步更新state里面的数据
    // this.setState(
    //   (prevState) => {
    //     return { count: prevState.count + 5 }
    //   },
    //   () => {
    //     console.log(this.state.count)
    //   }
    // )

    // setTimeout(() => {
    //     this.setState({count:this.state.count+1})
    //     this.setState({count:this.state.count+2})
    //     this.setState({count:this.state.count+3})
    // }, 0);

    setTimeout(() => {
      // 添加ReactDOM上的不稳定更新就会改变立即更新 变为异步更新
      ReactDOM.unstable_batchedUpdates(()=>{
        this.setState({count:this.state.count+1})
        this.setState({count:this.state.count+2})
        this.setState({count:this.state.count+3})
      })
    }, 0);
  }
  render() {
    console.log(this.state)
    return (
      <div>
        <span>我是parent组件</span>
        <button onClick={this.handleClick}>点击 +</button>
      </div>
    )
  }
}
export default Parent

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值