首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过多个元素的键来更新其状态?

如何通过多个元素的键来更新其状态?
EN

Stack Overflow用户
提问于 2022-06-18 19:25:00
回答 1查看 151关注 0票数 1

我正在尝试提交一个有4个表单字段的表单。

代码语言:javascript
复制
export type ChapterData = {
  chapterNumber: number;
  volumeNumber?: number;
  chapterName?: string;
  chapterImages: ImageListType;
};

我做了一个定制的钩子,useAddChapterForm

最初的状态是:

代码语言:javascript
复制
const initialState: ChapterData = {
  chapterNumber: 0,
  volumeNumber: 0,
  chapterName: '',
  chapterImages: [],
};

我希望在单一状态下更新所有这些元素的状态,并且使用了这种方法。

代码语言:javascript
复制
  const [chapterData, setChapterData] = useState<ChapterData>(initialState);
  const changeHandler = (e: ChangeEvent<HTMLInputElement>) => {
    setChapterData({ ...chapterData, [e.target.name]: e.target.value });
  };

但我想以不同的方式处理chapterImages的变化。我的钩子看起来是这样的。

代码语言:javascript
复制
export const useAddChapterForm = () => {
  const [chapterData, setChapterData] = useState<ChapterData>(initialState);
  const [images, setImages] = useState([]);
  const maxNumber = 69;

  const onChangeImageHandler = (imageList: ImageListType, addUpdateIndex: number[] | undefined) => {
    console.log(imageList, addUpdateIndex);
    setImages(imageList as never[]);
    setChapterData({ ...chapterData, [chapterData.chapterImages]: imageList });
  };

  const changeHandler = (e: ChangeEvent<HTMLInputElement>) => {
    setChapterData({ ...chapterData, [e.target.name]: e.target.value });
  };

  return {
    chapterData,
    maxNumber,
    changeHandler,
    images,
    onChangeImageHandler,
  };
};

我想设置chapterImages的值,当onChangeImageHandler有变化时,所以我也可以删除图像。

代码语言:javascript
复制
    setChapterData({ ...chapterData, [chapterData.chapterImages]: imageList });

有一个打字稿错误。那么,如何用key chapterData.chapterImages来更改setState的状态?

按照建议的答案更新了这个问题:

代码语言:javascript
复制
  const onChangeImageHandler = (imageList: ImageListType, addUpdateIndex: number[] | undefined) => {
    console.log(imageList, addUpdateIndex);
    setImages(imageList as never[]);
    setChapterData({ ...chapterData, chapterImages: imageList });
  };

  const changeHandler = (e: ChangeEvent<HTMLInputElement>) => {
    setChapterData({ ...chapterData, [e.target.name]: e.target.value });
  };

以下是句柄提交:

代码语言:javascript
复制
  const { chapterData, changeHandler } = useAddChapterForm();
  const handleSubmit = (e: FormEvent) => {
    e.preventDefault();
    console.log(chapterData);
  };
  return (
    <form onSubmit={handleSubmit}>
    ...

我正在使用组件上传图像。

代码语言:javascript
复制
export const ImageUploadField: FunctionComponent<ImageUploadFieldProps> = (
  props: ImageUploadFieldProps
) => {
  const { error } = props;
  const { images, onChangeImageHandler, maxNumber } = useAddChapterForm();
  return (
    <FieldWrapper label={'Select cover image'} errorMessage={error}>
      <ImageUploading multiple value={images} onChange={onChangeImageHandler} maxNumber={maxNumber}>
        {({
          imageList,
          onImageUpload,
          onImageRemoveAll,
          onImageUpdate,
          onImageRemove,
          isDragging,
          dragProps,
        }) => (
          <div className="outline-dashed outline-2 outline-offset-2">
            {imageList.length === 0 && (
              <button
                className="w-full text-center"
                style={isDragging ? { color: 'red' } : undefined}
                onClick={onImageUpload}
                {...dragProps}
              >
                Click or Drop here
              </button>
            )}
            <div className="flex flex-col justify-center">
              {imageList.length > 0 && (
                <div className="px-2 py-1 rounded bg-red-500 flex">
                  <button className=" space-x-2 w-full" onClick={onImageRemoveAll}>
                    Remove all images
                  </button>
                  <XCircle />
                </div>
              )}
              <div className="flex flex-wrap">
                {imageList.map((image, index) => (
                  <div key={index} className="flex">
                    <div className="flex flex-col p-2">
                      <Image
                        src={image.dataURL as string}
                        alt={image.file?.name}
                        width={150}
                        height={200}
                        quality={65}
                        className="rounded-tl rounded-bl"
                      />
                      <p>{image.file?.name}</p>
                      <div className="flex space-x-4">
                        <div className="flex px-2 py-1 rounded bg-green-500 space-x-2">
                          <button onClick={() => onImageUpdate(index)}>Update</button>
                          <PencilEdit />
                        </div>
                        <div className="flex px-2 py-1 rounded bg-red-500 space-x-2">
                          <button onClick={() => onImageRemove(index)}>Remove</button>
                          <XCircle />
                        </div>
                      </div>
                    </div>
                  </div>
                ))}
              </div>
            </div>
          </div>
        )}
      </ImageUploading>
    </FieldWrapper>
  );
};

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-18 19:35:31

这行不必使用计算属性名称

代码语言:javascript
复制
setChapterData({ ...chapterData, [chapterData.chapterImages]: imageList });

您可以像这样使用这个setter函数

代码语言:javascript
复制
setChapterData({ ...chapterData, chapterImages: imageList });
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72672144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档