【发布时间】:2022-01-04 19:09:43
【问题描述】:
当尝试在父子或兄弟组件中以“简单”方式(没有 redux 或上下文)在不同组件之间设置状态时,我对 props 的确切工作方式有点缺乏了解。
我已阅读文档,也许我只是在尝试自学反应/编码时理解这一点超级慢,但有人可以用“简单”的话解释以下内容:
- 在我的 parent.js 中,我拥有添加和删除文本并将其存储在列表中的所有逻辑
- 在我的 child.js 中,这是一个由 parent.js 创建的页面,作为列表的一部分,我希望能够删除整个列表项。现在这个逻辑是写在 parent.js 中的,所以我有点想从我的子组件中访问这个函数。
编辑 - 我包含了 2 个主要组件的代码: 编辑 2 - 返回“onRemove 不是函数”的测试代码:
Home.js
const Home = ({navigation, route}) => {
const [lists, setLists] = useState([])
const [isVisible, setVisibility] = useState(true)
const addItemToLists = (item) => {
lists.push(item)
setLists([...lists])
setVisibility(false)
}
**const removeItemFromLists = (index) => {
lists.splice(index,1)
setLists([...lists])
console.log("removed")
return(
<EditList test={test} onRemove={removeItemFromLists}/>
)
}**
const updateItemFromLists = (index,item) => {
lists[index] = item
setLists([...lists])
}
return(
<View style={styles.homeContainer}>
<View style={styles.homeContainer2}>
<TouchableOpacity onPress={()=>navigation.navigate("Edit", {saveChanges: addItemToLists})}>
<Ionicons name="add-circle" size={60} color="black"/>
</TouchableOpacity>
</View>
<View style={{alignItems: 'center'}}>
{!isVisible ? null : <Text>Add List-item</Text> }
</View>
<FlatList
data={lists}
renderItem={({item: {title}, index})=>{
return(
<Listbutton
title={title}
navigation={navigation}
onPress={()=>{navigation.navigate("List", {title})}}
onOptions={()=>{navigation.navigate(
"Edit",
{title, saveChanges:(item)=>updateItemFromLists(index,item)})}}
onDelete={()=> removeItemFromLists(index)}
/>
)
}}
/>
</View>
)
}
EditList.js
export default function EditList ({navigation, route,**test, onRemove**}){
const [title, setTitle] = useState(route.params.title || "")
const [isValid, setValidity] = useState(true)
return(
<View style={styles.editContainer}>
<View>
<TextInput
autoFocus={true}
underlineColorAndroid={"transparent"}
selectionColor={"transparent"}
value={title}
onChangeText={(text)=>
{setTitle(text)
setValidity(true)
}}
placeholder={"Add header"}
maxLength={25}
style={styles.todoEditTextInput}
/>
<View style={{alignSelf: "center"}}>
{!isValid && <Text style={{color:"red"}}>Add list</Text>}
</View>
<TouchableOpacity
style={{alignSelf: "center"}}
onPress={()=>{
if (title.length > 0) {
route.params.saveChanges({title})
navigation.dispatch(CommonActions.goBack())
} else {
setValidity(false)
}
}}>
<Ionicons name="checkmark-circle" size={50} style={{paddingLeft: 10,}}/>
</TouchableOpacity>
**<TouchableOpacity onPress={() => onRemove(test)}>
<Ionicons name="trash" size={50} style={{paddingLeft: 10,}}/>
</TouchableOpacity>**
【问题讨论】:
-
您能创建一个代码框示例来说明您想要实现的目标吗?
-
是的,如果这样更容易,我也可以在这里发布代码,但我只是想听听实现这样的事情的“正确”方法是什么。如果有意义的话,不需要直接回答我的代码只是它背后的逻辑吗?
-
StackOverflow 对这样的一般问题不屑一顾。你可能会在 React 论坛上得到更好的服务。
-
好吧,我可能会在新问题中添加特定代码!
-
无需提出新问题!只需将其编辑到您当前的问题中!
标签: reactjs react-native expo