reactjs - React Native Expo:useEffect 和 setParams 不起作用
问题描述
因此,我正在尝试创建一个将传递给我的 setParams 的函数,以便我可以通过 onPress 在导航器中执行该函数中的任何内容。
这是我的 EditProductsScreen:
import React, { useState, useEffect, useCallback } from 'react';
import { View, Text, StyleSheet, TextInput, ScrollView } from 'react-native';
import { useSelector } from 'react-redux';
import { CommonActions } from '@react-navigation/native';
const EditProductScreen = props => {
// Check if you are in edit mode
const prodId = props.route.params?.productId;
const editedProduct = useSelector(state => state.products.userProducts.find(prod => prod.id === prodId));
const [title, setTitle] = useState(editedProduct ? editedProduct.title : '');
const [imageUrl, setImageUrl] = useState(editedProduct ? editedProduct.imageUrl : '');
const [price, setPrice] = useState('');
const [description, setDescription] = useState(editedProduct ? editedProduct.description : '');
// In order to submit we need to use this handler
const submitHandler = useCallback(() => {
console.log('Submitting!')
});
useEffect(() => {
props.navigation.dispatch(CommonActions.setParams({ submit: submitHandler}));
}, [submitHandler])
正如你在这里看到的:
// In order to submit we need to use this handler
const submitHandler = useCallback(() => {
console.log('Submitting!')
});
useEffect(() => {
props.navigation.dispatch(CommonActions.setParams({ submit: submitHandler}));
}, [submitHandler])
我将它传递给我的 setParams 然后在我的导航中:
<AdminNavigator.Screen
name="EditProduct"
component={EditProductScreen}
options={({ route }) => {
// so when you navigate wihout passing anything the route.params is undefined
// when you access a property if undefined it throws an error
const productId = route.params?.productId;
const submit = route.params?.submit;
return {
title: productId ? "Edit Product" : "Add Product",
headerRight: () => (
<HeaderButtons HeaderButtonComponent={HeaderButton}>
<Item
title='Save'
iconName={Platform.OS === 'android' ? 'md-checkmark' : 'ios-checkmark'}
onPress={submit}
/>
</HeaderButtons>
)
};
}}
/>
</AdminNavigator.Navigator>
我正在尝试通过onPress={submit}
. 但不是 console.logging 单词“提交”它冻结屏幕并且根本不会移动到任何屏幕。知道是什么原因造成的吗?
解决方案
问题与导航无关,它在这些行中
const submitHandler = React.useCallback(() => {
console.log('Submitting!')
});
React.useEffect(() => {
console.log('Submitting! 121');
navigation.setParams({ submit: submitHandler});
}, [])
首先,如果您希望在安装组件时运行 useEffect ,则不应在此处传递依赖项,问题是当 sumbitHandler 作为依赖项提供时,它会不断重新渲染,这会导致 useCallback 创建新的 submitHandler ,因此它最终会无限环形。也不需要通过commonactions,您可以像上面那样直接设置参数。
推荐阅读
- sql - 有没有办法从 SQL 中获取当前时间和分钟以与日期时间进行比较?
- javascript - 如何传递选定行的值以弹出警报?
- java - Java生成二维码时如何满足EMV标准?
- r - 比较一个或两个数据帧 r 中的多列
- .net-core - 托管 .net 核心并创建托管实例
- mongodb - mongoDB如何更新多数组数据
- javascript - 如何循环运行我的 div 的全部内容?
- java - 使用 AlertDialog 中的上下文函数从 MainActivity 获取方法的问题
- wget - wget:抓取网页时保存URL
- python-3.x - 如何删除除括号和连字符(-)之外的所有特殊字符