组件化开发-05.01-组件状态的修改——componentDidMount组件更新是异步的;setState连续调用,不保证每次调用都会更新页面;通过返回一个新的state的方式来修改原有的状态数据

组件状态的修改——componentDidMount组件更新是异步的;setState连续调用,不保证每次调用都会更新页面;通过返回一个新的state的方式来修改原有的状态数据
  • 类组件中状态的变化必须使用setState,不可以直接修改
    • 状态的修改操作是异步的
    • 不建议频繁调用setState
class AboutState extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      num: 1
    }
  }
  componentDidMount () {
    // 状态的更新是异步的
    // this.setState({
    //   num: 2
    // }, () => {
    //   console.log('如果该回调函数触发了,说明数据已经完成更新')
    //   console.log(this.state.num)
    // })
    // console.log(this.state.num)
    // -----------------------------------
    // 如果setState连续调用,那么并不保证每次调用都会更新页面
    // 更新的原则:不要频繁调用setState
    // this.setState({
    //   num: this.state.num + 1
    // })
    // this.setState({
    //   num: this.state.num + 1
    // })
    // this.setState({
    //   num: this.state.num + 1
    // })
    // ---------------------------------
    this.setState((state, props) => {
      // state表示组件的内部原有数据
      // props表示父组件传递过来的数据
      // 采用这种方式修改状态的话,不要直接修改参数中的state
      // 而是要通过返回一个新的state的方式来修改原有的状态数据
      return {
        num: state.num + 2
      }
    })
  }
  render () {
    return (
      <div>
        <div>测试状态变化:{this.state.num}</div>
      </div>
    )
  }
}
实例

第一步:src下新建文件夹components,下面新建06.js

/*
  关于状态的更新问题 setState
*/
import React from 'react'

class AboutState extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      num: 1
    }
  }
  componentDidMount () {
    // 1、状态的更新是异步的
    // this.setState({
    //   num: 2
    // }, () => {
    //   console.log('如果该回调函数触发了,说明数据已经完成更新')
    //   console.log(this.state.num)
    // })
    // console.log(this.state.num)
    // -----------------------------------
    // 2、如果setState连续调用,那么并不保证每次调用都会更新页面
    // 更新的原则:不要频繁调用setState
    // this.setState({
    //   num: this.state.num + 1
    // })
    // this.setState({
    //   num: this.state.num + 1
    // })
    // this.setState({
    //   num: this.state.num + 1
    // })
    //3、 ---------------------------------
    this.setState((state, props) => {
      // state表示组件的内部原有数据
      // props表示父组件传递过来的数据
      // 采用这种方式修改状态的话,不要直接修改参数中的state
      // 而是要通过返回一个新的state的方式来修改原有的状态数据
      return {
        num: state.num + 2
      }
    })
  }
  render () {
    return (
      <div>
        <div>测试状态变化:{this.state.num}</div>
      </div>
    )
  }
}

export default AboutState

第二步:App.js中进行引入

import React from 'react';
import './App.css';
import AboutState from './component/06-关于状态的更新问题'

function App () {
  return (
    <div>
      <AboutState msg='hello'/>
    </div>
  )
}

export default App;

npm run start打开界面,显示

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是代码的优版本,包括添加了判断是否存在同样的数据和导入完成后删除源文本的功能: ``` Dim filePaths(5) As String Dim i As Integer ' 设置文件路径 filePaths(0) = "C:\Users\icd\Desktop\5月场景使用清单(按日)\场景服务方案使用清单05.01.xlsx" filePaths(1) = "C:\Users\icd\Desktop\5月场景使用清单(按日)\场景服务方案使用清单05.02.xlsx" filePaths(2) = "C:\Users\icd\Desktop\5月场景使用清单(按日)\场景服务方案使用清单05.03.xlsx" filePaths(3) = "C:\Users\icd\Desktop\5月场景使用清单(按日)\场景服务方案使用清单05.04.xlsx" filePaths(4) = "C:\Users\icd\Desktop\5月场景使用清单(按日)\场景服务方案使用清单05.05.xlsx" filePaths(5) = "C:\Users\icd\Desktop\5月场景使用清单(按日)\场景服务方案使用清单05.06.xlsx" ' 遍历文件路径数组,逐个导入Excel数据 For i = 0 To UBound(filePaths) ' 判断是否存在同样的数据 Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset("SELECT COUNT(*) FROM 场景使用清单 WHERE 文件路径 = '" & filePaths(i) & "'") If rs.Fields(0).Value > 0 Then MsgBox "文件 " & filePaths(i) & " 中的数据已经存在于数据库中。" Else ' 导入Excel数据 DoCmd.TransferSpreadsheet acImport, 10, "场景使用清单", filePaths(i), True, "" ' 添加文件路径到导入的记录 CurrentDb.Execute "UPDATE 场景使用清单 SET 文件路径 = '" & filePaths(i) & "' WHERE 文件路径 IS NULL" ' 删除源文本 Kill filePaths(i) End If Next i ``` 需要注意的是,上述代码中的 `场景使用清单` 表需要自行创建,其中需要包含至少以下字段: - ID:主键,自增长 - 文件路径:文本类型,记录导入的Excel文件路径 - 其他字段:根据具体情况添加 此外,还需要添加对 DAO 库的引用。在 VBA 编辑器中,依次点击“工具”→“引用”,勾选“Microsoft DAO 3.6 Object Library”即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值