在react项目中,唤起打印功能,出现数据异步问题导致打印的数据是上一次的数据内容。

2 篇文章 0 订阅
1 篇文章 0 订阅

在react项目中,我的需求是:在网页中唤起打印功能,打印报告单。


出现的问题是: 使用useState更新数据,数据存在异步问题,数据迟迟没有更新渲染,导致我唤起打印功能还是上次的数据模版。(有个迷惑行为就是:再唤起打印功能的时候,引入的模版肉眼可见的数据更新且渲染了,但是打印预览上面的数据确实空白,或者是上一次的数据模版)。

或者是说reportRef没有内容

import React, { useEffect, useState } from 'react';
import { Table, Button, Space, message} from 'antd';
import { useReactToPrint } from "react-to-print";
import { InspectReport} from '封装的组件库';


const testTable = () => {
  const [dataList, setDataList] = useState([]);
  const [dataDetail, setDataDetail] = useState([]);
  const reportRef = React.createRef();

  // 解决数据异步问题
  useEffect(() => {
    // 正常数据异步用useEffect就可以解决,但是我的实际情况是还是打印的上一次的数据
    // 所以这里我用了useEffect + setTimeout 完美解决了我数据异步导致打印还是上次数据的问题
    if(dataDetail?.data && dataDetail?.data.length) { // 数据判空处理
      setTimeout(()=> {
        handlePrint?.();
      },1000)
    }
  }, [dataDetail]);

  const getDataDetait = () => {
    let res = 数据请求返回的结果;
    return res;
  }

  // 打印功能
  const handlePrint = useReactToPrint({
    content: () => reportRef.current,
    pageStyle: "@page { size: A4 !important;  margin: 5mm !important;}",
    removeAfterPrint: true,
    documentTitle: `报告名称`,
    onAfterPrint: () => {
      message.success({ content: "开始打印!",duration: 2 });
    },
    onPrintError: () => {
      message.error({ content: "打印失败!",duration: 2 });
    },
  });

  const columns = [
    ...(其他列表项),
    {
      title: '姓名',
      dataIndex: 'name',
      key: 'name',
    },
    {
      title: '操作',
      width: 100,
      key: 'action',
      render: (_, record) => (
        <Space size="middle">
          <Button
            type="link"
            onClick={async() => {
              let formData = {
                ...(参数),
              }

              let res = await getDataDetail(formData)
              setDataDetail(res);
            }}
          >打印</Button>
        </Space>
      ),
    },
  ];

  // 表格
  <Table
    rowKey="id"
    dataSource={dataList}
    columns={columns}
  />

  // 引入的打印内容的组件(打印组件不要放在表格里)
  <div style={{
    position: 'relative',
    width: '100%',
    // display: 'none',
  }}>
    <InspectReport data={dataDetail} ref={reportRef} />  // 打印内容的模版组件
  </div>

};

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在一个React项目,可以使用Redux或者MobX等状态管理库来管理数据。这些库可以帮助开发者创建一个全局的store来存储应用程序的状态,这些状态可以被许多组件共享和访问。具体来说,可以按照以下步骤在Redux创建一个store来管理数据: 1. 安装redux和react-redux依赖库 ``` npm install --save redux react-redux ``` 2. 创建一个reducer来处理数据,reducer是一个纯函数,它接收当前的state和一个action,根据action的类型返回一个新的state ``` const initialState = { data: [], } function dataReducer(state = initialState, action) { switch (action.type) { case 'ADD_DATA': return { ...state, data: [...state.data, action.payload], } case 'REMOVE_DATA': return { ...state, data: state.data.filter(item => item.id !== action.payload.id), } default: return state } } ``` 3. 创建一个store,并将reducer传入 ``` import { createStore } from 'redux' import dataReducer from './reducers/dataReducer' const store = createStore(dataReducer) ``` 4. 在根组件使用Provider来将store传递给所有的子组件 ``` import { Provider } from 'react-redux' import store from './store' function App() { return ( <Provider store={store}> <div> ... </div> </Provider> ) } ``` 5. 在组件使用connect函数来连接store和组件,并将需要的数据作为props传递给组件 ``` import { connect } from 'react-redux' function MyComponent({ data, addData }) { const handleAddData = () => { addData({ id: 1, name: 'data1' }) } return ( <div> <button onClick={handleAddData}>Add Data</button> <ul> {data.map(item => ( <li key={item.id}>{item.name}</li> ))} </ul> </div> ) } const mapStateToProps = state => ({ data: state.data, }) const mapDispatchToProps = dispatch => ({ addData: data => dispatch({ type: 'ADD_DATA', payload: data }), }) export default connect(mapStateToProps, mapDispatchToProps)(MyComponent) ``` 以上就是在一个Redux管理数据的基本步骤,通过这种方式,可以方便地管理应用程序的状态,并且可以在任何组件访问和更新数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值