在 React 应用程序中使用 Redux 获取文本输入值
Getting Text Input value with Redux in a React App
我想创建一个小的聊天应用程序,它有一个留言板、一个文本输入和一个发送按钮。我这样做是为了 React/Redux
学习。我熟悉React
,得到了Redux
的概念。但是现在,我遇到了问题,在我的搜索中没有找到任何东西。
我想在按下发送按钮时捕获并发送文本输入数据。在纯粹的反应中,我通过 useState
将文本输入绑定到一个状态。现在用 Redux,我不知道我能做什么。如何将文本输入值传递给特定操作?我需要的很简单,捕捉文本输入值。但是我找不到任何资源。我不是在寻找表单或提交表单之类的东西,也没有向服务器提交数据等,只是获取输入值。我不知道是否可以将任何参数传递给 Redux 操作来存储它们?
我找不到任何教程或资源。任何帮助将不胜感激。
输入的反应中有 onChange 方法。并且有一个名为 redux thunk 的库可以对操作执行一些额外的逻辑并传递一些参数。
如果答案不充分,请详细说明您的问题
您可以调度一个动作,在按下提交按钮时接受输入值。然后,您可以在 redux reducer 中对捕获的值执行所需的操作。
从您的组件调度一个动作。
import React, {useRef} from 'react'
import {useDispatch} from 'react-redux'
export default function App(){
const textVal = useRef()
const dispatch = useDispatch()
function sendTextValueHandler(){
const inputVal = textVal.current.value
dispatch({type:'INP_VAL', message: inputVal}) //Pass input value to redux store
}
return(
<input type='text' ref={textVal}/>
<button onClick={sendTextValueHandler}>Send</button>
)
}
在你的 redux 商店中,
const reducer = (state={message:''},action)=>{
if(action.type === 'INP_VAL'){
const inputValue = action.message //Capture the input value and do the required operation.
return {...state,message:inputValue}
}
.
.
.
return state
}
const store = useStore(reducer)
export default store
以上片段是如何完成此任务的基本结构示例。一旦掌握了它的要点,您就可以进一步迁移到使用 redux-toolkit,它提供了更大的灵活性和更好的代码分段。
在添加 redux 之前,一个带有内部状态的简单解决方案如下所示:
import React, {useState} from 'react'
const Sample = () => {
const [inputValue, setInputValue] = useState("");
const handleChange = (e) => {
setInputValue(e.target.value)
}
return(
<input type='text' value={inputValue} onChange={handleChange} />
)
}
现在,尝试使用 redux 实现:
import React from 'react';
import {useDispatch, useSelector} from 'react-redux';
const Sample = () => {
const dispatch = useDispatch();
const inputValue = useSelector(state => state.sample.value)
const handleChange = (e) => {
dispatch({type: 'CHANGE_INPUT_VALUE`, payload: e.target.value})
}
return(
<input type='text' value={inputValue} onChange={handleChange}>
)
}
reducer 可能看起来像这样:
const initialState = {
value: "";
}
const sampleReducer = (state=initialState, action) => {
switch(action.type){
case 'CHANGE_INPUT_VALUE':
return{
...state,
value: action.payload
}
// other cases ...
default:
return state
}
}
我宁愿在单独的文件中定义操作和选择器,并将它们导入到需要的地方:
示例操作文件:
export const CHAGNE_INPUT_VALUE = 'CHANGE_INPUT_VALUE';
export const changeInputValue = (value) => ({type: CHAGNE_INPUT_VALUE, payload: value})
示例选择器文件:
export const selectInputValue = (state) => state.sample.value
现在将它们应用于示例组件:
import React from 'react';
import {useDispatch, useSelector} from 'react-redux';
import {changeInputValue} from 'path/to/action/file';
import {selectInputValue} from 'path/to/selector/file';
const Sample = () => {
const dispatch = useDispatch();
const inputValue = useSelector(selectInputValue)
const handleChange = (e) => {
dispatch(changeInputValue(e.target.value))
}
return(
<input type='text' value={inputValue} onChange={handleChange}>
)
}
现在,回到问题:
是的,您可以将任何内容作为有效载荷添加到减速器中,例如:
dispatch(updateUserProfile({name: "", age: 0, image: "", children: [], ...}))
case UPDATE_PROFILE:
return {
...state,
name: action.payload.name,
age: action.payload.age,
}
我想创建一个小的聊天应用程序,它有一个留言板、一个文本输入和一个发送按钮。我这样做是为了 React/Redux
学习。我熟悉React
,得到了Redux
的概念。但是现在,我遇到了问题,在我的搜索中没有找到任何东西。
我想在按下发送按钮时捕获并发送文本输入数据。在纯粹的反应中,我通过 useState
将文本输入绑定到一个状态。现在用 Redux,我不知道我能做什么。如何将文本输入值传递给特定操作?我需要的很简单,捕捉文本输入值。但是我找不到任何资源。我不是在寻找表单或提交表单之类的东西,也没有向服务器提交数据等,只是获取输入值。我不知道是否可以将任何参数传递给 Redux 操作来存储它们?
我找不到任何教程或资源。任何帮助将不胜感激。
输入的反应中有 onChange 方法。并且有一个名为 redux thunk 的库可以对操作执行一些额外的逻辑并传递一些参数。
如果答案不充分,请详细说明您的问题
您可以调度一个动作,在按下提交按钮时接受输入值。然后,您可以在 redux reducer 中对捕获的值执行所需的操作。
从您的组件调度一个动作。
import React, {useRef} from 'react'
import {useDispatch} from 'react-redux'
export default function App(){
const textVal = useRef()
const dispatch = useDispatch()
function sendTextValueHandler(){
const inputVal = textVal.current.value
dispatch({type:'INP_VAL', message: inputVal}) //Pass input value to redux store
}
return(
<input type='text' ref={textVal}/>
<button onClick={sendTextValueHandler}>Send</button>
)
}
在你的 redux 商店中,
const reducer = (state={message:''},action)=>{
if(action.type === 'INP_VAL'){
const inputValue = action.message //Capture the input value and do the required operation.
return {...state,message:inputValue}
}
.
.
.
return state
}
const store = useStore(reducer)
export default store
以上片段是如何完成此任务的基本结构示例。一旦掌握了它的要点,您就可以进一步迁移到使用 redux-toolkit,它提供了更大的灵活性和更好的代码分段。
在添加 redux 之前,一个带有内部状态的简单解决方案如下所示:
import React, {useState} from 'react'
const Sample = () => {
const [inputValue, setInputValue] = useState("");
const handleChange = (e) => {
setInputValue(e.target.value)
}
return(
<input type='text' value={inputValue} onChange={handleChange} />
)
}
现在,尝试使用 redux 实现:
import React from 'react';
import {useDispatch, useSelector} from 'react-redux';
const Sample = () => {
const dispatch = useDispatch();
const inputValue = useSelector(state => state.sample.value)
const handleChange = (e) => {
dispatch({type: 'CHANGE_INPUT_VALUE`, payload: e.target.value})
}
return(
<input type='text' value={inputValue} onChange={handleChange}>
)
}
reducer 可能看起来像这样:
const initialState = {
value: "";
}
const sampleReducer = (state=initialState, action) => {
switch(action.type){
case 'CHANGE_INPUT_VALUE':
return{
...state,
value: action.payload
}
// other cases ...
default:
return state
}
}
我宁愿在单独的文件中定义操作和选择器,并将它们导入到需要的地方:
示例操作文件:
export const CHAGNE_INPUT_VALUE = 'CHANGE_INPUT_VALUE';
export const changeInputValue = (value) => ({type: CHAGNE_INPUT_VALUE, payload: value})
示例选择器文件:
export const selectInputValue = (state) => state.sample.value
现在将它们应用于示例组件:
import React from 'react';
import {useDispatch, useSelector} from 'react-redux';
import {changeInputValue} from 'path/to/action/file';
import {selectInputValue} from 'path/to/selector/file';
const Sample = () => {
const dispatch = useDispatch();
const inputValue = useSelector(selectInputValue)
const handleChange = (e) => {
dispatch(changeInputValue(e.target.value))
}
return(
<input type='text' value={inputValue} onChange={handleChange}>
)
}
现在,回到问题: 是的,您可以将任何内容作为有效载荷添加到减速器中,例如:
dispatch(updateUserProfile({name: "", age: 0, image: "", children: [], ...}))
case UPDATE_PROFILE:
return {
...state,
name: action.payload.name,
age: action.payload.age,
}