Привет, я создал компонент списка в React Native для своей страницы настроек. Я хочу, чтобы у каждого компонента на странице настроек была функция (в некоторых случаях нет).
Я создал array
с objects
, куда я помещаю атрибут каждого элемента.
const list = [
{
title: 'Change user settings',
icon: 'account-circle',
link: 'UserEdit',
action: this.noFunction()
},
{
title: 'Logout',
icon: 'exit-to-app',
link: 'Auth',
action: this.sessionFunction()
},
]
Прямо сейчас у меня есть два элемента списка, каждый со своей собственной функцией, примененной к их атрибуту action
.
Когда я нажимаю один listItem
в своем приложении, он вызывает обе функции.
Однако я хочу, чтобы применялась только функция, связанная с приложением.
Как я могу это сделать? И что в моем коде вызывает эту ошибку?
noFunction(){
console.info('noFunction')
}
sessionFunction =() => {
console.info('sessionFunction')
this.deleteSession().then(() => {
this.props.destroySession();
})
}
render(){
const list = [
{
title: 'Change user settings',
icon: 'account-circle',
link: 'UserEdit',
action: this.noFunction()
},
{
title: 'Logout',
icon: 'exit-to-app',
link: 'Auth',
action: this.sessionFunction()
},
]
return (
<View>
{
list.map((item, i) => (
<ListItem
key = {i}
title = {item.title}
leftIcon = {
{ name: item.icon }
}
onPress = {() => {
item.action
this.props.navigation.navigate(item.link)
}}
/>
))
}
</View>
)
}
}
Просто удалите ()
из функций.
Когда у вас есть что-то вроде action: this.noFunction()
, вы выполняете функцию и назначаете ее action
, поэтому foo.action
будет значением, возвращаемым из вызова noFunction
(которое в вашем случае не определено, потому что noFunction
ничего не возвращает).
Если вы передаете его как action: this.noFunction
, вы передаете только ссылку на функцию, а позже вы можете сделать foo.action()
и вызвать noFunction
.
Это вызовет ошибку с noFunction
, я думаю - undefined is not a function
.
Спасибо, кажется, это работает. Мне нужно было добавить () к обратному вызову item.action. Сделать это похожим на item.action()
Вам нужно удалить выражение вызова ()
.
action: this.sessionFunction()
немедленно выполняет функция, она не присваиваетсяaction
, она присваивается результат этой функцииaction
. А так какsessionFunction
не имеет оператораreturn
, то он присваиваетundefined
.