微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React 和 redux 工具包:如何​​添加从拖放事件中获取数据的 reducer

如何解决React 和 redux 工具包:如何​​添加从拖放事件中获取数据的 reducer

React 和 redux 非常新。我正在尝试向我的 React 应用程序添加文件拖放功能,但在使用 redux 时遇到了问题 工具包的 createSlice 函数

我不断收到“TypeError:无法读取未定义的属性“fileList””。我认为这是因为我搞砸了下面 searchSlice.js 中的 addFilesToList 减速器。

任何帮助将不胜感激。请看我下面的代码

searchSlice.js

import { createSlice } from '@reduxjs/toolkit'


export const searchSlice = createSlice({
    name:'search',initialState: {
        fileList: [],inDropZone: false,},reducers: {

        addToDropZone: (state) => {
            return state.inDropZone = true
        },addFilesToList: (state,e) => {
            return state.fileList = [...e.dataTransfer.files]
        }
    }
})

export const { addToDropZone,addFilesToList } = searchSlice.actions

export default searchSlice.reducer

DragDrop.js

import React from 'react'
import { useSelector,usedispatch } from 'react-redux'
import { addToDropZone,addFilesToList } from './searchSlice.js'
import DragArea from './DragArea.js'
import TableArea from './TableArea.js'

//import img from './components/images/drag.PNG'//


const DragDrop = (props) => {

    const files = useSelector((state) => state.searchSlice.fileList)
    const inDropZone = useSelector((state) => state.searchSlice.inDropZone)
    const dispatch = usedispatch()
    //const { data,dispatch } = props//


    const handledragenter = (e) => {
        e.preventDefault();
        e.stopPropagation();

        dispatch(addToDropZone());
    };
    const handleDragLeave = (e) => {
        e.preventDefault();
        e.stopPropagation();
    };
    const handleDragOver = (e) => {
        e.preventDefault();
        e.stopPropagation();
        e.dataTransfer.dropEffect = 'copy';
        dispatch(addToDropZone());
    };
    const handleDrop = (e) => {
        e.preventDefault();
        e.stopPropagation();

        dispatch(addFilesToList());
        dispatch(addToDropZone());

        if (files && files.length > 0) {
            const existingFiles = files.map(f => f.name)
            files = files.filter(f => !existingFiles.includes(f.name))


        }

    };


    if (inDropZone === true && files.length === 0) {
        return(
                <div className = "drag-and-drop" 
                    onDrop={handleDrop}
                    onDragOver= {handleDragOver}
                    ondragenter={handledragenter}
                    onDragLeave={handleDragLeave}>
                    <DragArea  />
                </div>
        )
    } else {
        return(
            <div className = "table-area" 
                onDrop={handleDrop}
                onDragOver= {handleDragOver}
                ondragenter={handledragenter}
                onDragLeave={handleDragLeave}>
                <TableArea data = {files} />
        </div>
        )
    } 
}


export default DragDrop;

解决方法

您的 addFilesToList 减速器中的 e 类型是 PayloadAction。这意味着它的形状是这样的:

{
  type: “search/addFilesToList”,payload: valueYouPassToActionCreator
}

valueYouPassToActionCreator 是您在分发 addFilesToList 操作创建器时传递给它的任何内容,例如:

dispatch(addFilesToList(valueYouPassToActionCreator))

然而,你正在做:

dispatch(addFilesToList())

这意味着您的 PayloadAction 上的 .payload 属性未定义。简而言之,您需要将某些内容传递给动作创建者。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。