【发布时间】:2021-08-27 21:52:30
【问题描述】:
假设我正在构建一个购物清单应用。我有能力创建不同的购物清单。我有三个屏幕:
-- Shopping Lists: displays all the lists
---- List Details: displays all the items from a list
------ List Item Details: displays all the info about an item
为了存储状态并避免道具钻孔,我使用了 Context。我的状态可能如下所示:
shoppingLists = [
{
title: 'Groceries',
items: [{
name: 'Apples',
quantity: 3
... (other info)
},
items: [{
name: 'Oranges',
quantity: 6,
...
}]
},
{
title: 'Office Supplies',
items: [{
name: 'Paper',
quantity: 2
... (other info)
},
items: [{
name: 'Pens',
quantity: 25,
...
}]
}]
当我点击购物清单屏幕上的购物清单时,我会这样做
navigation.navigate('ListDetails', {params: listItem})
在“列表详细信息”屏幕中,我可以更改项目的数量或删除它们。如果我执行任何这些操作,我必须对我的服务器进行 API 调用以更新数据库上的值。以下是我的问题:
- 目前我将值存储在屏幕中的局部变量中,例如:
const [title, setTitle] = useState(props.route.params.title)
const [items, setItems] = useState(prop.route.params.items)
如果我更改数量,我会使用 setState 更新我的本地数组,然后调用 API 来更新上下文。当添加更多嵌套屏幕时,这会导致问题。 例如,如果我让用户能够在 List Item Details 屏幕中更改项目数量,那么当用户返回 List Details 屏幕时,这些值将不会更新。
我的问题是,获取上下文状态并在本地更新它的正确方法是什么? 例如,我应该这样做:
navigation.navigate('ListDetails', {params: { listName: 'Groceries' })
然后在我的列表详细信息屏幕中从数组中获取正确的列表,例如:
const {lists} = useContext(ShoppingLists)
const list = lists.filter(l => l.title === props.route.params.title)
正确的方法是什么?
- 我的另一个问题是一个更普遍的问题。我想使用乐观的响应:当用户更新列表中项目的数量时,我在本地更新它并将请求发送到服务器。如果有错误回滚更改。哪种方法是正确的?
谢谢!
【问题讨论】:
标签: javascript reactjs react-native react-navigation