You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript-React Native:如何正确向NavigationDialog函数传递参数

如何正确给NavigationDialog传参并实现通用场景使用

你的代码里isVisible参数的问题核心是内部状态与props重名冲突,再加上props类型定义错误、语法疏漏,导致组件无法被外部正确控制。下面是具体修复方案:

1. 修复props类型定义的语法错误

原代码的TypeScript类型声明写法有误,正确的解构+类型声明方式应该是:

const NavigationDialog = ({ latitude, longitude, isVisible, onClose }: {
  latitude: number;
  longitude: number;
  isVisible: boolean;
  onClose: () => void;
}) => {
  // ...组件逻辑
}

2. 移除内部冲突的isVisible状态,改为受控组件

你内部声明的useState(isVisible)会覆盖外部传入的props值,导致父组件无法控制弹窗显示。要让组件通用,应该做成受控组件:由父组件传入isVisible控制显示状态,传入onClose回调处理关闭逻辑,组件内部不再维护独立状态。

3. 修复options里的语法疏漏

cancelText: 'close, 缺少闭合单引号,应改为cancelText: 'close',

完整修复后的代码

import React from 'react';
import { Popup } from 'react-native-map-link';
import styles from './NavigationDialogStyle';

const NavigationDialog = ({ latitude, longitude, isVisible, onClose }: {
  latitude: number;
  longitude: number;
  isVisible: boolean;
  onClose: () => void;
}) => {
  const options = {
    latitude,
    longitude,
    dialogTitle: '打开方式',
    dialogMessage: '选择导航应用',
    cancelText: '关闭',
  };

  return (
    <Popup
      isVisible={isVisible}
      onCancelPressed={onClose}
      onAppPressed={onClose}
      onBackButtonPressed={onClose}
      modalProps={{
        animationIn: 'slideInUp',
      }}
      appsWhiteList={['waze', 'google-maps']}
      options={options}
      style={{ container: styles.popupStyle }}
    />
  );
};

export default NavigationDialog;

父组件调用示例

现在你可以在任意场景中使用这个组件,完全由父组件控制它的显示与隐藏:

import React, { useState } from 'react';
import { Button } from 'react-native';
import NavigationDialog from './NavigationDialog';

const ParentComponent = () => {
  const [showNavDialog, setShowNavDialog] = useState(false);
  const targetCoords = {
    latitude: 39.9042,
    longitude: 116.4074,
  };

  return (
    <>
      <Button
        title="打开导航选择弹窗"
        onPress={() => setShowNavDialog(true)}
      />
      <NavigationDialog
        latitude={targetCoords.latitude}
        longitude={targetCoords.longitude}
        isVisible={showNavDialog}
        onClose={() => setShowNavDialog(false)}
      />
    </>
  );
};

export default ParentComponent;

额外说明

如果需要组件同时支持受控和非受控模式(比如允许内部默认维护状态),可以增加兼容逻辑,但通用场景下优先使用受控组件,逻辑更清晰,适配性更强。

内容的提问来源于stack exchange,提问作者emma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:30:23