javascript - React redux reducer 从状态获取数据?

标签 javascript reactjs redux

尝试使用 React 和 Redux 来从 API 获取文件列表。

在查看 react 开发工具时,我可以在那里看到我的数据,但它没有被渲染。

actions.js

export const requestFiles  = ({
    type: REQUEST_FILES,
});

export const receiveFiles = (json) => ({
    type: RECEIVE_FILES,
    files: json,
    receivedAt: Date.now()
});


export const fetchFiles = (dispatch) => {
    dispatch(requestFiles);
    return fetch('/api/files')
        .then(response => response.json())
        .then(json => dispatch(receiveFiles(json)))
};

该操作从 JSON 获取数据

enter image description here

reducer.js

const files = (state = {
    isFetching: false,
    items: []
}, action) => {
    switch (action.type) {
        case REQUEST_FILES:
            return {
                ...state,
                isFetching: true,
            };
        case RECEIVE_FILES:
            return {
                ...state,
                isFetching: false,
                items: action.files,
                lastUpdated: action.receivedAt
            };
        default:
            return state
    }
};

const filesUploaded = (state = { }, action) => {
    switch (action.type) {
        case RECEIVE_FILES:
        case REQUEST_FILES:
            return {
                ...state,
                items: files(state[action], action)
            };
        default:
            return state
    }
};

const rootReducer = combineReducers({
    filesUploaded
});

export default rootReducer

App.js

class App extends Component {
    static propTypes = {
        files: PropTypes.array.isRequired,
        isFetching: PropTypes.bool.isRequired,
        dispatch: PropTypes.func.isRequired
    };

    componentDidMount() {
        const {dispatch} = this.props;
        dispatch(fetchFiles);
    }

    handleChange = nextSubreddit => {
    };

    render() {
        const {files, isFetching} = this.props;
        const isEmpty = files.length === 0;
        console.log(`Files is empty ${isEmpty}`);
        return (
            <div>
                <h1>Uploadr</h1>
                {isEmpty
                    ? (isFetching ? <h2>Loading...</h2> : <h2>No files.</h2>)
                    : <div style={{opacity: isFetching ? 0.5 : 1}}>
                        <Files files={files}/>
                    </div>
                }
            </div>
        )
    }
}

const mapStateToProps = state => {
    const {uploadedFiles} = state;
    const {isFetching, items: files} = uploadedFiles
        || {isFetching: true, items: []};

    console.log(files);

    return {
        files,
        isFetching,
    }
};

enter image description here

操作中收到的数据,但我不确定它是否被存储或者问题是否是从 redux 存储访问它。

应用程序组件上的文件属性仍然为零,如上面的屏幕截图所示。

有什么想法吗?

最佳答案

删除您的filesUploaded reducer 。你不需要它。相反,只需使用 files 缩减器:

const rootReducer = combineReducers({
    files,
}); 

请注意,您感兴趣的状态切片将称为files。将您的 mapStateToProps 函数更改为:

const mapStateToProps = state => {
    const {isFetching, items: files} = state.files

    console.log(files);

    return {
        files,
        isFetching,
    }
};

您可以在这里看到,我们获取状态的 files 切片并将其传递到您的组件中。

关于javascript - React redux reducer 从状态获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51883891/

相关文章:

javascript - 如何选择 id 取决于 javascript 变量的行?

Javascript 如何强制单击键?

javascript - 如何使用 Knockout foreach 构建多列布局?

javascript - 在 Redux 中使用 LocalStorage 保持多个状态

javascript - Promise.all 解决得太早

javascript - 管理 React JS 应用程序中的角色

javascript - 使用正则表达式解析复杂定界的字符串

reactjs - 如何在功能组件中使用 onChange 事件处理程序动态设置状态

reactjs - 包装在 redux 容器中的组件的大量实例会对性能产生负面影响吗?

reactjs - 处理来自输入文件的文件并稍后上传 react redux