You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React自定义Hook如何传递点击时获取的文件名参数

解决文件名传递问题的方案

问题核心是你当前的useProgress Hook在初始化时就要求传入文件名,但文件名只有点击按钮时才能获取。我们可以调整Hook的设计,让返回的进度启动函数接收文件名参数,而不是在Hook初始化时传入。

修改useProgress Hook

调整Hook逻辑,让返回的handleProgress函数接受name参数,同时每次启动进度时重置进度的起始值,避免多个文件之间的状态干扰:

import { useRef } from "react";

const useProgress = (updater, initialProgress) => {
  const mockRef = useRef(initialProgress);

  const handleProgress = (name) => {
    // 每次启动进度前重置初始值
    mockRef.current = initialProgress;
    const intervalID = setInterval(() => {
      if (mockRef.current >= 100) {
        clearInterval(intervalID);
        updater((prevState) =>
          prevState.map((item) =>
            item.name === name ? { ...item, status: 100 } : item
          )
        );
      } else {
        mockRef.current += 10;
        updater((prevState) =>
          prevState.map((item) =>
            item.name === name ? { ...item, status: mockRef.current } : item
          )
        );
      }
    }, 200);
  };

  return handleProgress;
};

export default useProgress;

修改父组件App

在父组件中,调用initiateProgress时直接传入点击的文件名即可:

import React, { useState } from "react";
import "./styles.css";
import ProgressBar from "./ProgressBar";
import useProgress from "./useProgress";

const appStyles = {
  height: 20,
  width: 500,
  margin: 50
};

export default function App() {
  const [files, setFiles] = useState([
    { name: "file1", status: 0 },
    { name: "file2", status: 0 },
    { name: "file3", status: 0 }
  ]);

  // 初始化Hook时只传入setter和初始进度
  const initiateProgress = useProgress(setFiles, 60);

  const initiate = (name) => {
    // 调用进度启动函数时传入文件名
    initiateProgress(name);
  };

  return (
    <div className="App" style={appStyles}>
      {files.map((file) => {
        return (
          <div key={file.name}>
            <button type="button" onClick={() => initiate(file.name)}>
              {file.name}
            </button>
            <ProgressBar bgColor={"#DF8100"} progress={file.status} />
            {file.status === 100 && <span>Upload complete</span>}
          </div>
        );
      })}
    </div>
  );
}

关键改动说明

  • 把文件名参数从Hook的初始化参数移到返回函数的参数中,这样就能在点击按钮时动态传递。
  • 每次调用handleProgress时重置mockRef.current为初始进度,确保每个文件的进度都是从60开始递增,不会因为之前的文件进度影响当前文件。

内容的提问来源于stack exchange,提问作者lrr59

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:52:05