gpt4 book ai didi

reactjs - 当输入字段已使用 useState() 映射时如何使用 useSelector() 连接 redux 存储

转载 作者:行者123 更新时间:2023-12-04 14:19:54 25 4
gpt4 key购买 nike

我正在使用新的 React-Redux Hooks 库

我有一个 React 组件,它有两个输入字段,使用 useState() - desc 和 amount 更新到 React 存储。为了在编辑字段时更新对 redux 存储的更改,我使用 onBlur 事件并调用 dispatch 到 redux 存储。这很好用。

当我想清除另一个组件的字段时,我希望它能以与基于类的函数相同的方式工作,通过连接和映射状态到 Prop ,但是对于功能组件,我需要使用 useSelector()。我不能这样做,因为标识符 desc 和 amount 已经被 useState() 使用了

我在这里错过了什么?

import { useDispatch, useSelector } from "react-redux"
import { defineItem, clearItem } from "../store/actions"

const ItemDef = props => {
const dispatch = useDispatch()

const [desc, setDesc] = useState(itemDef.desc)
const [amount, setAmount] = useState(itemDef.amount)

//MAPSTATETOPROPS
//I WANT TO HAVE THESE VALUES UPDATED WHEN REDUX STORE CHANGES FROM ANOTHER COMPONENT
//THESE LINES WILL CAUSE ERROR to effect - identifier has already been declared
const desc = useSelector(state => state.pendingItem.desc)
const amount = useSelector(state => state.pendingItem.amount)

return (
<div>
<p>Define new items to be added below - before clicking Add Item</p>
<input
value={desc}
type="text"
name="desc"
placeholder="Description of Item"
onChange={e => setDesc(e.target.value)}
//Use onBlur Event so that changes are only submitted to store when field loses focus
onBlur={e => dispatch(defineItem(desc, amount))}
/>
&nbsp;
<input
value={amount}
type="number"
name="amount"
placeholder="Amount"
onChange={e => setAmount(e.target.value)}
//Use onBlur Event so that changes are only submitted to store when field loses focus
onBlur={e => {
dispatch(defineItem(desc, amount))
}}
/>
</div>
)
}

export default ItemDef

最佳答案

解决方案 - 在存储库中使用完整代码

我通过使用 useSelector(将 redux 状态的 pendingItem 部分映射到 itemDef)和 setEffect Hook 将 useState 应用于状态项(来自输入)或 itemDef(来自 Redux 状态 - 这发生在 redux 更新时通过另一个组件或通过添加项目到输入按钮)

我已经在下面发布了工作组件。我还发布了这个小应用程序来演示如何将 reacdt-redux 库与基于类的组件和使用 Hook 的功能组件一起使用

存储库是 https://github.com/Intelliflex/hiresystem

//**************************************************************************************************
//***** ITEMDEF COMPONENT - Allow entry of new Items (dispatched from button in HireList Table) ****
//**************************************************************************************************
import React, { useState, useEffect, useRef } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { defineItem, clearItem } from '../store/actions'
import _ from 'lodash'

const ItemDef = props => {
//BRING IN DISPATCH FROM REDUX STORE
const dispatch = useDispatch()

//DEFINE SELECTOR - EQUIV TO MAPSTATETOPROPS
const { itemDef } = useSelector(state => ({
itemDef: state.pendingItem
}))

const [item, setItem] = useState({ desc: '', amount: 0 })

const onChange = e => {
setItem({
...item,
[e.target.name]: e.target.value
})
}

const prevItem = useRef(item)
useEffect(() => {
//WE NEED TO CONDITIONALLY UPDATE BASED ON EITHER STORE BEING CHANGED DIRECTLY OR INPUT FORM CHANGING
if (!_.isEqual(item, prevItem.current)) {
//INPUT HAS CHANGED
setItem(item)
} else if (!_.isEqual(item, itemDef)) {
//REDUX STATE HAS CHANGED
setItem(itemDef)
}
prevItem.current = item
}, [item, itemDef]) //Note: item and ItemDef are passed in as second argument in order to use setItem

const clearIt = e => {
dispatch(clearItem())
}

const addIt = e => {
dispatch(defineItem({ desc: 'MY NEW ITEM', amount: 222 }))
}

return (
<div>
<p>Define new items to be added below - before clicking Add Item</p>
<input
value={item.desc}
type='text'
name='desc'
placeholder='Description of Item'
onChange={onChange}
//Use onBlur Event so that changes are only submitted to store when field loses focus
onBlur={e => dispatch(defineItem(item))}
/>
&nbsp;
<input
value={item.amount}
type='number'
name='amount'
placeholder='Amount'
onChange={onChange}
//Use onBlur Event so that changes are only submitted to store when field loses focus
onBlur={e => dispatch(defineItem(item))}
/>
&nbsp;
<button onClick={clearIt}>CLEAR ITEM</button>
&nbsp;
<button onClick={addIt}>ADD ITEM TO INPUT</button>
</div>
)
}

export default ItemDef

关于reactjs - 当输入字段已使用 useState() 映射时如何使用 useSelector() 连接 redux 存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56231851/

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