【发布时间】:2022-01-04 16:55:29
【问题描述】:
我最近开始使用函数式组件和 react-query 来使用 react,它一直运行良好,只是我不清楚如何正确组织组件。
我习惯于设计组件的方式是拥有一个顶级组件,该组件执行所有数据访问并通过道具将数据传递给它的子组件。它还将各种回调处理程序传递给子组件,以便在需要操作时,顶级组件将更新数据并将新数据传递给子组件。所以在我的例子中,所有对 useQuery()、useMutation() 的调用都驻留在顶级组件中,但这会使代码变得非常混乱。但它更像是一个包含各种子组件的页面,这些子组件仅显示数据或帮助用户与数据交互。
function Page(){
const [page, setPage] = useState(1)
const [size, setSize] = useState(10)
const persons = useQuery('persons', async ()=> await getPersons(page, size))
const addPerson = useMutation(async (args)=> {
const {id, name, desc} = args
await addPerson(id, name, description)
})
const person = useQuery('persons', async ()=> await getOnePerson(page, size), { enabled : false })
const addPersonCB = (id: number, name: string, desc: string)=> {
addPerson.mutate({id, name, desc})
}
// complex if/else logic to choose child components
第二种方法是将 react useQuery() 和 useMutation 分散到需要的组件中。为了进一步简化事情,如果渲染逻辑很复杂,每个组件都会有一个父组件来执行操作并将数据作为 prop 传递。
function PersonCard(props: PersonCardPropsType){
const {data, isLoading, isError, error} = useQuery(`personQuery${props.id}`, getPerson)
if(isLoading)
return <Wait />
if(isError)
return <Error reason={error} />
const record = data as PersonModel
return ( <PersonCardUI person={record} />)
}
并且可能有网格,表格等的组件,每一个都以成对的形式出现
<PersonEditor />, <PersonEditorUI />, <PersonGrid />, <PersonGridUI />
在这种情况下,调用分散在代码中的任何地方。我想知道
- 对于大型项目,推荐哪种方法?为什么?
- Redux 和 react-Query 的混合搭配好吗?例如,网格的页面大小和页码应该放在 redux 中,也许?
- 可以在某些地方使用纯 axios/fetch 和 redux/react-query 吗?这被认为是一种不受欢迎的做事方式?
【问题讨论】:
-
所有这些都归结为意见。对于#1,这取决于您的需求;我们在需要的地方使用 r-q 钩子,并且不会通过组件层向下传递事物(但如果它是共享数据,我们也会为其中的一些使用上下文)。 #2 当然,虽然我很少将 Redux 用于纯 UI 问题——这就是 state 的用途。 #3 使用任何在上下文中最有意义的东西。
-
不久前我在使用 useSwr 时遇到过同样的问题。我采用了混合方法。我的
useSwr周围有自定义钩子,我尽可能地提升状态。然后我将 redux 用于全局状态,例如 auth user。另外,当提升状态变得太麻烦并且 redux 似乎有点矫枉过正时,我使用了 react 的 context api。我也有过滤器,其状态在 url 本身中。总而言之,这种混合方法似乎效果很好。 -
所以你说的是,“没有方法是错误的,这完全取决于一个人的需求”,但如果这是我们在大型项目中遵循的方法,那么它会不会在一段时间后变成代码混乱3-4 位开发人员正在根据自己的意见工作?
-
对...我认为您总是可以争论给定方法的优点/缺点,但我怀疑是否存在一种做事方式。这将是一个判断电话。我确实认为一个人无法摆脱 redux,并且喜欢将它用于全局状态,只要它被谨慎使用。
标签: reactjs typescript react-hooks react-functional-component react-query