Javascript Can’;t从React Native中的父组件更新子组件的属性

Javascript Can’;t从React Native中的父组件更新子组件的属性,javascript,android,ios,react-native,expo,Javascript,Android,Ios,React Native,Expo,我是一个新手,在手机开发方面会做出反应。我用的是世博会。我无法管理一个国家 我有一个SearchTextBox组件,我想从父组件设置文本属性,但是我无法使用useState管理它 import React,{useState,useffect}来自“React”; 从“反应本机手势处理程序”导入{TouchableOpacity}; 从“@expo/vector icons”导入{Ionicons}”; 从“react native”导入{StyleSheet,TextInput,View};

我是一个新手,在手机开发方面会做出反应。我用的是世博会。我无法管理一个国家

我有一个
SearchTextBox
组件,我想从父组件设置文本属性,但是我无法使用
useState
管理它

import React,{useState,useffect}来自“React”;
从“反应本机手势处理程序”导入{TouchableOpacity};
从“@expo/vector icons”导入{Ionicons}”;
从“react native”导入{StyleSheet,TextInput,View};
从“./config/styles”导入默认样式;
函数搜索文本框({
搜索查询,
宽度=“100%”,
在研究中,
…其他道具
}) {
const[query,setQuery]=useState(searchQuery);
常量[isClearable,setIsClearable]=useState(
query!=null&&query.length>0
);
const onChange=(e)=>{
const{text}=e.nativeEvent;
设置查询(文本);
常量长度=text.length;
设置可清除(长度>0);
如果(长度>=2&&onSearch)onSearch(文本);
};
const onClear=()=>{
setQuery(“”);
setisclearanable(false);
};
返回(
{isclear&&(
)}
);
}
const styles=StyleSheet.create({
容器:{
backgroundColor:defaultStyles.colors.light,
边界半径:24,
flexDirection:“行”,
弹性:1,
玛吉:10,
},
图标:{
差额:15,
paddingRight:15,
},
正文:{
flexGrow:1,
尺码:18,
},
});
导出默认搜索文本框;
我是这样使用的:


从“React”导入React,{useState,useffect,useRef};
从“react native”导入{View,StyleSheet,FlatList,AsyncStorage};
从“expo ads admob”导入{AdMobBanner};
从“expo设备”导入*作为设备;
从“./components/List/”导入{ListItem,ListItemSeparator};
从“./组件/屏幕”导入屏幕;
从“./组件/SearchTextBox”导入SearchTextBox;
从“./components/AnimatedTextList”导入AnimatedTextList;
从“./config/colors”导入颜色;
从“./api/search”导入searchApi;
从“./hooks/useApi”导入useApi;
从“./config/ads”导入广告;
功能主屏幕(){
const search=useApi(searchApi.search);
const[data,setData]=useState([]);
常量[showRandomWords,setShowRandomWords]=useState(true);
const[randomWords,setRandomWords]=useState([]);
const[bannerType,setBannerType]=useState(“banner”);
const[initialQuery,setInitialQuery]=useState();
const getDeviceTypeAsync=async()=>{
const deviceType=await Device.getDeviceTypeAsync();
挫折类型(
deviceType===Device.deviceType.TABLET?“完整横幅”:“横幅”
);
};
useffect(()=>{
getDeviceTypeAsync;
}, []);
const onSearch=async(值)=>{
setShowRandomWords(值==null | |值==未定义的| |值===”);
const result=等待搜索请求(值);
如果(!result.ok)返回;
setData(result.data.data);
};
useffect(()=>{
const getRandomWords=async()=>{
试一试{
const result=await AsyncStorage.getItem(“随机单词”);
如果(!result)返回;
setRandomWords(JSON.parse(result));
设置单词(true);
}捕获(错误){
console.log(错误);
}
};
getRandomWords();
}, []);
const bannerError=(错误)=>{
log(“尝试显示AdMob时出错”,错误);
};
const onRandomWordPress=(项目)=>{
setInitialQuery(item.title);
onSearch(初始查询);
};
返回(
{显示随机词&&(
)}
word.id.toString()}
renderItem={({item})=>(
)}
ItemSeparatorComponent={ListItemSeparator}
/>
);
}
const styles=StyleSheet.create({
底部横幅:{
内容:“中心”,
对齐项目:“中心”,
对准自己:“居中”,
底部:0,
位置:“绝对”,
宽度:“100%”,
},
容器:{
弹性:1,
对齐项目:“中心”,
宽度:“100%”,
flexDirection:“列”,
},
搜索框:{
背景颜色:colors.white,
身高:100,
宽度:“100%”,
填充:10,
},
结果:{
宽度:“100%”,
弹性:1,
},
});
导出默认主屏幕;
这是我的财产


onRandomWordPress
中,我设置了变量,但它不会更新输入的文本

const onRandomWordPress=(项目)=>{
setInitialQuery(item.title);
onSearch(初始查询);
};
正确的方法是什么?我的实现有什么问题


谢谢

您不应该将此处的
随机词
传递给您的
onSearch
函数吗

const onRandomWordPress = (item) => {
    setInitialQuery(item.title);
    onSearch(item.title);
};

以下是我如何实现的。我将查询绑定到父组件(始终),从父组件管理几乎所有内容

现在,我有了一个更干净的
SearchTextBox
组件

函数搜索文本框({
搜索查询,
上下文变化,
在QueryClear,
宽度=“100%”,
…其他道具
}) {
const hasSearchQuery=()=>{
return searchQuery!=null&&searchQuery.length>0;
};
const onChange=(e)=>{
const{text}=e.nativeEvent;
onTextChange(文本);
};
返回(
{hasSearchQuery()&&(
)}
);
}
并从父级管理零件:

功能主屏幕(){
const search=useApi(searchApi.search);
const[data,setData]=useState([]);
常量[showRandomWords,setShowRandomWords]=useState(true);
const[randomWords,setRandomWords]=useState([]);
const[initialQuery,setInitialQuery]=useState();
const onSearch=async(值)=>{
C