android - 将 useState 更新函数传递给子进程会导致未定义的函数错误
问题描述
使用 expo 和 react-native 我创建了一个名为MainStateScreen
this screen 的屏幕,它基本上有两个直接的子级,称为OptionsComponent
and NavigationButton
。OptionsComponent
有多个子元素,在修改时更新 的状态,MainStateScreen
以便我们可以将其作为道具传递给带有NavigationButton
. 至少它应该是这样工作的。
相反,当我尝试修改OptionsComponent
' 的子级并使用MainStateScreen
' 更新功能时,我收到以下错误。
这是我的组件组成的伪代码:
MainStateScreen.js
const defaultOptionsObject = [
{
name: '',
value: 1,
count: 0,
},
{
name: '',
value: 8,
count: 0,
},
{
name: '',
value: 20,
count: 0,
},
{
name: '',
value: 25,
count: 0,
},
{
name: '',
value: 30,
count: 0,
},
{
name: '',
value: 32,
count: 0,
},
{
name: '',
value: 100,
count: 0,
},
]
const MainStateScreen = () => {
const [options, setOptions] = useState(defaultOptionsObject)
return (
<View>
<ScrollView>
<OptionsComponent options={options} setOptions={setOptions} />
</ScrollView>
<NavigationButton onPress={() => navigation.push('OtherScreen', { options })} />
</View>
)
}
选项组件.js
const SingleOptionComponent = ({ index, option, options, setOptions }) => {
const [stateOption, setStateOption] = useState({ ...option })
const updateCount = val => {
const tempOption = { ...stateOption }
if (val) {
tempOption.count += 1
} else if (tempOption.count !== 0) {
tempOption.count -= 1
}
setStateOption(tempOption)
}
useEffect(() => {
const tempOptions = [ ...options ]
tempOptions[index] = { ...stateOption }
setOptions(tempOptions) // Commenting this out removes the error.
}, [stateOption])
const AddSubtractButton = () => {
return (
<View>
<TouchableHighlight onPress={() => updateCount(true)}>
<Text>Add</Text>
</TouchableHighlight>
<TouchableHighlight onPress={() => updateCount(false)}>
<Text>Subtract</Text>
</TouchableHighlight>
</View>
)
}
return (
<ListItem rightElement={AddSubtractButton} />
)
}
const OptionsComponent = ({ options, setOptions }) => {
return (
<View>
{options.map((option, index) => {
return (
<SingleOptionComponent
key={`${option?.value}-${index}`}
index={index}
option={option}
options={options}
setOptions={setOptions}
/>
)
})}
<View/>
)
}
确切的错误是:
TypeError: undefined is not a function (near '...options.map...')
This error is located at:
in OptionsComponent (at MainStateScreen.js)
但是,当我在of中console.log
的setOptions
功能时,会在控制台中打印。useEffect
SingleOptionComponent
Function setOptions
如果我从内部删除setOptions(tempOptions)
调用,错误就会消失,但我需要类似的东西来完成传递给父级并传递给.useEffect
SingleOptionComponent
NavigationButton
我可能做错了什么?
解决方案
我建议的几件事可以解决问题,而无需在我的机器上重新创建它。尝试添加setOptions
到useEffect
依赖数组。也许由于某种原因,它没有得到更新的 setOptions ,因为它被传递给了孙子组件。您还应该将其传递options
给它,因为您的效果取决于该值何时更改。
如果这不起作用,请尝试使用扩展运算符setOptions({ ... tempOptions})
。
如果这不起作用,我建议在最上面的组件中处理 setOptions ,而是将回调传递给孙子而不是setOptions
函数。该回调并option
在父级中按下,然后根据它适当地更新它option._id
(我会为每个选项提供一个唯一的 _id 而不是动态计算它只是为了能够执行上述操作。)。也使代码更容易理解发生了什么,因为父级将处理它自己需要的状态并适当地设置它。
推荐阅读
- android - Android Room - 如何仅获取新数据?
- ruby-on-rails - 为什么 `Rails.application.credentials.api_key` 在我的 Rails 5.2 应用程序中返回 `nil`?
- python - 闪烁弹丸
- swift - 如何查找字符串是否真的匹配正则表达式
- c# - Xamarin.Android Visual Studio 2017 中的 Java.Lang.NullPointerException
- dart - 如何使用 UrlLauncher 从我的 Flutter 应用程序直接向 WhatsApp 发送消息?
- c++ - ROS中如何订阅两个主题的好方法(图片和边框分开发布)
- android - Android:在 Kotlin 中使用自定义 BindingAdapters 似乎不起作用
- c - 如何修复“return 0 / exit(0) 在 for 循环中无法正常工作”?
- c++ - FreeType - Texture Atlas - 为什么我的文本呈现为四边形?