Batch入门

简介

React 将多个状态更新分组到一个重新渲染中以获得更好的性能。

  • 减少中间状态,提高系统稳定性。
  • 提升渲染性能。

变动

18 以前

同步代码块的会合并,promisesetTimeoutevent回调函数中会立刻渲染不会进行合并。

18 以后

任何情况都可以合并渲染了,包括 promisesetTimeoutevent

如果需要调用后立即重新渲染,使用flushSync包裹。

批量更新逻辑

class 类组件

import React from 'react';
import { Button, Space } from 'antd';

export default class ClassCom extends React.Component {
  
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    }
  }
  
  handlerClick = () => {
    this.setState({ count: this.state.count + 1 });
    console.log(this.state.count);
    
    setTimeout(() => {
      console.log(this.state.count);
      this.setState({ count: this.state.count + 3 });
      console.log(this.state.count);
      this.setState({ count: this.state.count + 4 });
      console.log(this.state.count);
    }, 0);
    
    this.setState({ count: this.state.count + 2 });
    console.log(this.state.count);
  }
  
  render() {
    return (
      <div>
        <Space>
          <Button onClick={this.handlerClick}>setState click</Button>
          <p>count: {this.state.count}</p>
        </Space>
      </div>
    );
  }
}

React@18 渲染结果

// console 打印
0
0
2
2
2

// 最终 count 结果
6
// 0 + 1
// 0 + 2
// 2 + 3
// 2 + 4

React@17 渲染结果

function 函数组件

import React, { useState } from 'react';
import { Button, Space } from 'antd';

export default function HooksCom() {
  const [count, setCount] = useState(0);

  const handlerClick = () => {
    setCount(count + 1);
    console.log(count);

    setTimeout(() => {
      console.log(count);
      setCount(count + 3);
      console.log(count);
      setCount(count + 4);
      console.log(count);
    }, 0);

    setCount(count + 2);
    console.log(count);
  };
  return (
    <div>
      <Space>
        <Button onClick={handlerClick}>useState click</Button>
        <p>count: {count}</p>
      </Space>
    </div>
  );
}

React@18 渲染结果

React@17 渲染结果

这里为什么 react@18 中,函数组件的输出结果为 0 0 0 0 0 渲染 4,而类组件输出结果为 0 0 2 2 2渲染 6

类组件中,this.state.count 是会根据 this 而改变的。而函数组件中,countsetTimeout 中不会改变,所以一直是 0

函数式组件与类组件有何不同?

他们是完全不同的宝可梦哦。

https://overreacted.io/zh-hans/how-are-function-components-different-from-classes/

批量更新 render 影响

添加一个 render 组件

import { useEffect } from 'react';
export default function RenderEl() {
  useEffect(() => {
    console.log('useEffect render');
  }, []);
  console.log('render');
  return null;
}

加到上面两种类型的组件中

<div>
  <Space>
    <Button onClick={this.handlerClick}>setState click</Button>
    <p>
      count: {this.state.count}
      <RenderEl />
    </p>
  </Space>

</div>

再次点击渲染观察打印结果。

class 类组件

React@18 渲染结果

React@17 渲染结果

function 函数组件

React@18 渲染结果

React@17 渲染结果

  • 38
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
好的,这是一个使用Spring Batch实现读取CSV文件并写入数据库的入门案例。首先,你需要设置Spring Batch的环境,包括以下依赖: ```xml <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-core</artifactId> <version>${spring.batch.version}</version> </dependency> <dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-infrastructure</artifactId> <version>${spring.batch.version}</version> </dependency> ``` 接下来,你需要创建一个Job,Job可以包含一个或多个Step,每个Step都可以包含一个或多个Tasklet或Chunk。我们将使用FlatFileItemReader读取CSV文件,然后将数据写入数据库。 ```java @Configuration public class BatchConfig { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFactory; @Autowired private DataSource dataSource; @Bean public FlatFileItemReader<User> reader() { FlatFileItemReader<User> reader = new FlatFileItemReader<>(); reader.setResource(new ClassPathResource("users.csv")); reader.setLineMapper(new DefaultLineMapper<User>() {{ setLineTokenizer(new DelimitedLineTokenizer() {{ setNames(new String[]{"firstName", "lastName", "email"}); }}); setFieldSetMapper(new BeanWrapperFieldSetMapper<User>() {{ setTargetType(User.class); }}); }}); return reader; } @Bean public JdbcBatchItemWriter<User> writer() { JdbcBatchItemWriter<User> writer = new JdbcBatchItemWriter<>(); writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()); writer.setSql("INSERT INTO user (first_name, last_name, email) VALUES (:firstName, :lastName, :email)"); writer.setDataSource(dataSource); return writer; } @Bean public Step step1() { return stepBuilderFactory.get("step1") .<User, User>chunk(10) .reader(reader()) .writer(writer()) .build(); } @Bean public Job importUserJob() { return jobBuilderFactory.get("importUserJob") .incrementer(new RunIdIncrementer()) .flow(step1()) .end() .build(); } } ``` 在上面的代码中,我们定义了一个FlatFileItemReader,它将从CSV文件中读取数据,然后我们使用JdbcBatchItemWriter将数据写入数据库中。Step包含了reader和writer,它们分别读取和写入数据。最后我们定义了一个Job,它包含了一个步骤(step),并使用RunIdIncrementer来确保每次运行Job都会生成一个唯一的ID。 现在你可以运行这个Job了,只需要注入JobLauncher并调用它的run方法即可: ```java @Autowired private JobLauncher jobLauncher; @Autowired private Job importUserJob; public void runJob() throws Exception { JobParameters jobParameters = new JobParametersBuilder() .addLong("time", System.currentTimeMillis()) .toJobParameters(); jobLauncher.run(importUserJob, jobParameters); } ``` 这样就完成了一个简单的使用Spring Batch的读取CSV文件并写入数据库的入门案例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值