【发布时间】:2019-07-23 19:16:22
【问题描述】:
我正在使用 React 应用程序,我需要将 id 传递给在 onClick/onPress 方法上打开的模式。
下面的组件是我将用来渲染来自数组的一些数据的组件,它是调用模态的组件:
// imports ...
import {
passengerCardIdAction,
pickupPassengerCardIdAction,,
} from '../../screens/HomeScreen/actions/homeScreen';
const PassengersInfo = ({
id, // THIS IS THE ID I NEED
name,
address,
datetime,
callModal,
cardinalpoint,
navigationStore,
}) => {
return (
<View>
<View>
<View>
// MAYBE I CAN SET SOMETHING HERE WHERE I GRAB THE ID
// ON THE onPress METHOD ALONG WITH THE CALL MODAL FUNCTION
<TouchableOpacity onPress={callModal}>
CALL MODAL
</TouchableOpacity>
</View>
</View>
</View>
);
};
export default compose(
connect(
store => ({
passengerCardId: store.homeScreen.passengerCardId,
pickupPassengerCardId: store.homeScreen.pickupPassengerCardId,
}),
dispatch => ({
passengerCardIdActionHandler: id => {
dispatch(passengerCardIdAction(id));
},
pickupPassengerCardIdActionHandler: id => {
dispatch(pickupPassengerCardIdAction(id));
},
}),
),
)(PassengersInfo);
然后,在此处调用该组件:
class PassengerCardBasedOnRoute extends Component {
const { popupsModalsActionHandler, searchParam } = this.props;
render() {
return (
{passengerInfo.map(info => (
<View key={info.id}>
<PassengersInfo
id={info.id}
name={info.name}
address={info.address}
datetime={info.timestamp}
searchParam={searchParam}
cardinalpoint={info.cardinalpoint}
callModal={popupsModalsActionHandler}
/>
</View>
)}
);
}
};
export default compose(
connect(
store => ({
searchParam: store.homeScreen.searchParam,
navigationStore: store.homeScreen.navigation,
passengerCardId: store.homeScreen.passengerCardId,
allPassengersDropOffOptionsPopup:
store.popupsModals.allPassengersDropOffOptionsPopup,
pickupPassengerCardId: store.homeScreen.pickupPassengerCardId,
}),
dispatch => ({
popupsModalsActionHandler: data => {
dispatch(popupsModalsAction(data));
},
passengerCardIdActionHandler: id => {
dispatch(passengerCardIdAction(id));
},
pickupPassengerCardIdActionHandler: id => {
dispatch(pickupPassengerCardIdAction(id));
},
}),
),
)(PassengerCardBasedOnRoute);
如果可以的话,我可以获取 ID 并使用 Redux 设置它。
之前,我在 PassengersInfo 组件中设置模态信息,但由于它是一个数组,因此模态被调用了大约 40 次,因为父组件被渲染的时间。
这就是我之前的做法:
return (
{passengerInfo.map(info => (
<View key={info.id}>
<OptionsModal>
{
<AllPassengersOptionsModal
id={info.id}
handleDeleteOptionsModal={() =>
this.handleDeletePassenger(info.id)
}
handleCallOptionsModal={() =>
Linking.openURL(`tel:${info.phone}`)
}
/>
}
</OptionsModal>
<PassengersInfo
id={info.id}
name={info.name}
address={info.address}
datetime={info.timestamp}
searchParam={searchParam}
cardinalpoint={info.cardinalpoint}
callModal={popupsModalsActionHandler}
/>
</View>
)}
);
所以,通过上述方式,我得到了完全符合我需要的数据。那么如何实现一些东西来获取我需要的 ID 呢?我需要的是每张卡片上的信息,因为模态包括 delete 和 call 之类的操作。
查看我的代码中的注释。
编辑以显示减速器和操作
动作
export const popupsModalsAction = () => ({
type: ActionTypes.TOGGLE_ALL_PASSENGERS_MODAL,
});
减速器
const initialState = {
allPassengersDropOffOptionsPopup: false,
};
const handlers = {
[ActionTypes.TOGGLE_ALL_PASSENGERS_MODAL](state) {
return {
...state,
allPassengersDropOffOptionsPopup: !state.allPassengersDropOffOptionsPopup,
};
},
};
【问题讨论】:
-
你试过
onPress={() => callModal(id)}吗? -
嗨@BrunoEduardo
callModal是一个道具,可以像你告诉我的那样做吗?就像传递带参数的道具一样? -
是的,请参阅下面的答案。
callModal包含一个函数签名,这就是为什么你可以像普通函数一样调用它并传递 t 个参数。 -
编辑了我的答案。
标签: javascript reactjs react-native ecmascript-6 redux