【问题标题】:Take input value from submit form and store in redux store to use later从提交表单中获取输入值并存储在 redux 存储中以供以后使用
【发布时间】:2021-12-20 12:37:56
【问题描述】:

我正在做一个项目,其中第一个屏幕是一个简单的输入来放置名称,然后它转到另一个屏幕(另一个组件),我需要使用用户之前输入的值来显示自定义内容。我尝试用 Redux 来做,但我很难将输入值存储在 Redux Store 中,然后在另一个组件中使用该值。我想知道如何存储这个值,然后在另一个组件中使用它(老实说,我不知道该怎么做)。如果有人愿意,我也可以显示其他组件代码。

我的第一个组件(用户输入他的名字):

import React, {useState, useEffect} from "react";
import "../_assets/signup.css";
import "../_assets/App.css";
import { Link } from 'react-router-dom';
    
function Signup() {
  const [name, setName] = useState('')
  const [buttonGrey, setButtonGrey] = useState('#cccccc')
    
  useEffect(() => {
    if(name!== '') {
      setButtonGrey("black")
    } else {
      setButtonGrey('#cccccc')
    }
  }, [name])
    
  const handleSubmitForm= (e) => {
    e.preventDefault()
    store.dispatch({
      type: 'SAVE_USER',
      payload: name,
    })
    console.log({name})
  }
    
  const handleChangeName = (text) => {
    setName(text)
  }
    
  return (
    <div className="container">
      <div className="LoginBox">
        <form onSubmit={handleSubmitForm}>
          <h2>Welcome to codeleap network</h2>
          <text>Please enter your username</text>
          <input
            type="text" 
            name="name" 
            value={name} 
            onChange = {e => handleChangeName(e.target.value)} 
            placeholder="Jane Doe" 
          />
          <div className="button">
            <Link to="/main">
              <button 
                type="submit" 
                style={{backgroundColor: buttonGrey}} 
                disabled={!name} 
              >
                ENTER
              </button>
            </Link>
          </div>
        </form>
      </div>
    </div>
  );
}
    
export default Signup;

我的 store.js:

import { createStore } from 'redux';
        
const reducer = (state= (''), action) => {
  switch(action.type) {
    case 'SAVE_USER': {
      state = {...state, name: action.payload}
    }
    default: return state
  }
}
        
const store = createStore(reducer)
            
export {store}

标题

【问题讨论】:

  • 这段代码根本没有使用 Redux。你是在问如何开始使用 Redux 来持久化状态? redux-toolkit.js.org你自己尝试过什么?
  • 是的,我读过很多关于 Redux 的文章,但我承认我对完成我需要的东西了解得不够多,所以我想知道“从哪里开始”。 (我编辑并添加了商店代码)。
  • 如果一个答案解决/解决了您的问题/问题,那么您将被邀请标记/接受它 (stackoverflow.com/help/someone-answers)。干杯,祝你好运!

标签: javascript reactjs redux react-redux react-hooks


【解决方案1】:

首先,我建议使用Redux-Toolkit。它使站立和配置 React redux 存储变得非常容易。

这是quick-start guide

  1. 创建/转换为状态切片。创建切片时,您同时声明状态切片的名称、动作、reducer函数。

    import { createSlice } from "@reduxjs/toolkit";
    
    const userSlice = createSlice({
      name: "user",
      initialState: "",
      reducers: {
        saveUser: (state, action) => action.payload
      }
    });
    
  2. 创建和配置商店。

    import { configureStore } from "@reduxjs/toolkit";
    import userSlice from "../path/to/userSlice";
    
    const store = configureStore({
      reducer: {
        user: userSlice.reducer
      }
    });
    
  3. 渲染 Provider 并传递 store 属性。

    import { Provider } from "react-redux";
    
    <Provider store={store}>
      ... app component ...
    </Provider>
    

从这里导入dispatch函数并选择状态,为此使用react-redux中的useDispatchuseSelector

注册

import { useDispatch } from "react-redux";

function Signup() {
  const dispatch = useDispatch(); // <-- dispatch function
  const navigate = useNavigate();

  const [name, setName] = useState("");

  const handleSubmitForm = (e) => {
    e.preventDefault();
    dispatch(userSlice.actions.saveUser(name)); // <-- dispatch the action
    navigate("/main");
  };

  const handleChangeName = (text) => {
    setName(text);
  };

  return (
    ...
  );
}

示例主要组件:

import { useSelector } from "react-redux";

const Main = () => {
  const user = useSelector((state) => state.user); // <-- select the user state

  return (
    <>
      <h1>Main</h1>
      <div>User: {user}</div>
    </>
  );
};

【讨论】:

  • 谢谢兄弟!!!你帮了我很多!我在这里进行了测试,得到了我想要的结果......谢谢你的真实
  • 还有一个问题:我的应用程序的另一个组件是 CRUD,用户可以在其中创建帖子、编辑帖子等等。我需要当他返回上一页(输入页面)时,他创建的帖子不会被删除。我试图做一个类似于你教我保存帖子的过程,但它没有用,有什么技巧可以做到这一点吗?我会留下一个打印件来展示这个组件是怎样的。
  • @HeitorKenzou 这听起来与您在这篇文章中所问的问题不同有点离题)。如果您发布一个新问题,您可以更快地吸引更多人关注新问题。如果您愿意,请随时在此处 ping 我并提供指向它的链接,我有空时可以查看。
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 2022-01-21
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多