gpt4 book ai didi

javascript - 如何使用功能组件从 Redux 存储中检索数据并避免 useSelector 和 useDispatch

转载 作者:行者123 更新时间:2023-12-05 02:40:42 26 4
gpt4 key购买 nike

我正在 React-Redux 中尝试 Todo App;运行存储、操作、reducer 和 Addodo 组件;但在显示待办事项时卡住了:

如果我的 initialState=[] 我如何从存储中检索数据?

商店:

import { createStore } from 'redux';
import rootReducer from '../reducer';

export const store = createStore(
rootReducer,
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);

export default store

我的 reducer :

const initialState = [];


const todos = (state = initialState, action) => {
switch(action.type) {
// Aca va tu codigo;
case 'AddTodo':
return [...state, action.payload];

case 'RemoveTodo':
return state.filter(todo => todo.id !== action.payload)

case 'ToInProgress':
return state.map((todo) =>
todo.id === action.payload ? { ...todo, status: "InProgress" } : todo
);

case 'ToDone':
return state.map((todo) =>
todo.id === action.payload ? { ...todo, status: "Done" } : todo
);

default:
return state
}
}

export default todos;

应用程序.js:

import React from 'react'
import { Route } from "react-router-dom"
import {Provider} from 'react-redux'
import store from './store/index'

import Nav from '../src/components/Nav/Nav'
import Home from '../src/components/Home/Home'
import AddTodo from '../src/components/AddTodo/AddTodo'
import TodoDetail from '../src/components/TodoDetail/TodoDetail'
import './App.css';

export function App() {
return (
<React.Fragment>
<Provider store={store}>
<Nav />
<Route exact path="/" component={Home} />
<Route path="/add" component={AddTodo} />
<Route path="/edit/:id" component={TodoDetail} />
</Provider>
</React.Fragment>
);
}

export default App;

首页.js:

import React from 'react';
import Todos from '../Todos/Todos'
import './home.css'

export function Home() {
return (

<div className="todosContainer">
<div>
<Todos status="Todo"/>
<label>TODO</label>
</div>
<div>
<Todos status='InProgress' />
<label>InProgress</label>
</div>
<div>
<Todos status='Done'/>
<label>Done</label>
</div>
</div>
)
};

export default Home;

这是 AddTodo:

export function AddTodo() {
const [state,setState]=React.useState({
title:"",
description:"",
place:"",
date:"",
})

function handleChange(e){
const value=e.target.value;
setState({
...state,
[e.target.name]:value
})
}

function handleSubmit(e){
e.preventDefault();
store.dispatch(addTodo({
place:state.place,
title:state.title,
date:state.date,
description:state.description
})) // parameters "id" & "status" loaded in Actions.
setState({title:"",
description:"",
place:"",
date:"",})
}

return (
<div className="todoContainer">
<form id="formulario"onSubmit={handleSubmit} >
<label>
Title
<input type="text" name="title" value={state.title} onChange={handleChange} />
</label>
<label>
Description
<textarea type="text" name="description" value={state.description} onChange= {handleChange}/>
</label>
<label>
Place
<input type="text" name="place" value={state.place} onChange={handleChange}/>
</label>
<label>
Date
<input type="text" name="date" value={state.date} onChange={handleChange}/>
</label>
<button className="boton" type="submit" onClick={addTodo}>Agregar</button>
</form>
</div>
)
};

function mapDispatchToProps(dispatch){
return{
addTodo: todo => dispatch(addTodo(todo))
}
}

export default connect(mapDispatchToProps)(AddTodo)

现在,我想在 Todos 组件上显示,每个 Todos 的“标题”,仍然不知道如何执行:

export function Todos(data) {

return (
<div className="todoDetail">

<h4>{data.title}</h4>
</div>
)
};

function mapStateToProps(state) {
return {
data: state.title,
};

}
export default connect(mapStateToProps)(Todos)

最佳答案

您正在寻找useSelector钩子(Hook)。

不要在功能组件中使用store.getState()。此外,您不需要连接功能组件,使用useDispatch钩子(Hook)。

从商店获取值将是这样的:

const todos = useSelector(store => store.items);

关于javascript - 如何使用功能组件从 Redux 存储中检索数据并避免 useSelector 和 useDispatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68401549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com