【问题标题】:React Typescript hooks and propsReact Typescript 钩子和道具
【发布时间】:2021-10-21 15:55:06
【问题描述】:

这是我第一个使用 Typescript 和 React Native 的项目。我只是在 App.tsx 上创建了一个简单的逻辑,然后我尝试用一​​个组件来拆分它。但是,当我从 Modal 组件传递道具时,我得到一个错误 ts(2322)。我知道代码需要改进,因为这是我第一次使用 Typescript。我不知道是否有人可以帮助我指导我。 下面是我做的原始 App.tsx:

import { Button, FlatList, Modal, StyleSheet, Text, TextInput, View } from 'react-native';

import React from 'react';
import { useState } from 'react';

export interface AppProps {
  id: string | number;
  item: string;
  name: string;
  placeholder: string;
  value: string
}
 
const App: React.FC<AppProps> = () => {
  const [textInput, setTextInput] = useState<string>('');
  const [itemList, setItemList] = useState<any[]>([]);

  const [itemSelected, setItemSelected] = useState<any>({});
  const [modalVisible, setModalVisible] = useState<boolean>(false);

  const handlerConfirmDelete = () => {
    setItemList(itemList.filter(item => item.id !== itemSelected.id));
    setItemSelected({});
    setModalVisible(false);
  }

  const handlerModalOpen = (id: string) => {
    setItemSelected(itemList.find(item => item.id === id));
    setModalVisible(true);
  }

  const onHandlerChangeText = (textValue: string) => setTextInput(textValue);
  const handleAddPress = () => {
    setItemList([
      ...itemList,
      {
        id: Math.random().toString(),
        value: textInput,
      },
    ]);
  }
  return (
    <>
    <View style={styles.container}>
      <View style={styles.firstInputs}>        
        <TextInput placeholder='Item de Lista'
        onChangeText={onHandlerChangeText}
        value={textInput} />
        <Button title='Add' onPress={handleAddPress} />
      </View>
      <View>
        <FlatList
        data={itemList}
        keyExtractor={(item) => item.id}
        renderItem={(data) => (
          <View>          
            <Text>{data.item.value}</Text>  
            <Button title='X' onPress={() => handlerModalOpen(data.item.id)} />        
          </View>
        )}      
        />
      </View>   
    </View>
    <Modal animationType='slide' visible={modalVisible}>
      <View>
        <Text>Borrar</Text>
      </View>
      <View>
        <Text>seguro q borramos?</Text>
      </View>
      <View>
        <Text>{itemSelected.value}</Text>
      </View>
      <View>
        <Button onPress={handlerConfirmDelete} title='Confirm' />
      </View>
    </Modal>
    </>
  );
}

export default App;

这是新的 App.tsx 和 Modal.tsx: 应用程序.tsx

import { Button, FlatList, Modal, StyleSheet, Text, TextInput, View } from 'react-native';

import ModalComponent from './components/Modal';
import React from 'react';
import { useState } from 'react';

export interface AppProps {
  id: string | number;
  item: string;
  name: string;
  placeholder: string;
  value: string
}
 
const App: React.FC<AppProps> = () => {
  const [textInput, setTextInput] = useState<string>('');
  const [itemList, setItemList] = useState<any[]>([]);

  const [itemSelected, setItemSelected] = useState<any>({});
  const [modalVisible, setModalVisible] = useState<boolean>(false);

  const handlerConfirmDelete = () => {
    setItemList(itemList.filter(item => item.id !== itemSelected.id));
    setItemSelected({});
    setModalVisible(false);
  }

  const handlerModalOpen = (id: string) => {
    setItemSelected(itemList.find(item => item.id === id));
    setModalVisible(true);
  }

  const onHandlerChangeText = (textValue: string) => setTextInput(textValue);
  const handleAddPress = () => {
    setItemList([
      ...itemList,
      {
        id: Math.random().toString(),
        value: textInput,
      },
    ]);
  }
  return (
    <>
    <View style={styles.container}>
      <View style={styles.firstInputs}>        
        <TextInput placeholder='Item de Lista'
        onChangeText={onHandlerChangeText}
        value={textInput} />
        <Button title='Add' onPress={handleAddPress} />
      </View>
      <View>
        <FlatList
        data={itemList}
        keyExtractor={(item) => item.id}
        renderItem={(data) => (
          <View>          
            <Text>{data.item.value}</Text>  
            <Button title='X' onPress={() => handlerModalOpen(data.item.id)} />        
          </View>
        )}      
        />
      </View>   
    </View>
    <ModalComponent modalVisible={modalVisible} itemSelected={itemSelected} handlerConfirmDelete={handlerConfirmDelete} />
    </>
  );
}

export default App;

Modal.tsx

import { Button, Modal, StyleSheet, Text, View } from "react-native";

import { AppProps } from "../../App";

export interface ModalComponentProps {
    props: AppProps
    
}
 
const ModalComponent: React.FC<ModalComponentProps> = (props: any) => {
    
    const {modalVisible, itemSelected, handlerConfirmDelete} = props;
    return (
        <>
            <Modal animationType='slide' visible={modalVisible}>
                <View style={styles.modalContainer}>           
                    <View style={[styles.modalContent, styles.shadow]}>
                        <Text style={styles.modalMessage}>Seguro deseas borrar?</Text>
                        <Text style={styles.modalTitle}>{itemSelected.value}</Text>                    
                        <View>
                            <Button onPress={handlerConfirmDelete} title='Confirm' />
                        </View>
                    </View>
                </View>
            </Modal>
        </>
    );
}
export default ModalComponent;

我还没有放置样式,因为我想首先让它正常工作。提前致谢。

这是错误: 输入'{ modalVisible: boolean;项目选择:任何; handlerConfirmDelete: () => 无效; }' 不可分配给类型 'IntrinsicAttributes & ModalComponentProps & { children?: ReactNode; }'。 类型'IntrinsicAttributes & ModalComponentProps & { children?: ReactNode; 上不存在属性'modalVisible' }'。

【问题讨论】:

  • 错误是什么?你想做什么,到底什么不起作用?
  • 嗨@windowsill 错误是这个类型'{ modalVisible: boolean;项目选择:任何; handlerConfirmDelete: () => 无效; }' 不可分配给类型 'IntrinsicAttributes & ModalComponentProps & { children?: ReactNode; }'。类型'IntrinsicAttributes & ModalComponentProps & { children?: ReactNode; 上不存在属性'modalVisible' }'。我正在尝试将 Modal.tsx 的道具传递给 App.tsx 我有来自 Typescript 的错误,它使应用程序无法运行
  • 请在问题中添加错误????
  • 我只是将它添加到问题@SamridhTuladhar
  • 知道了,ModalComponent的接口写错了,我把正确的接口写在答案里????

标签: typescript react-native react-hooks react-props react-typescript


【解决方案1】:

这里有一些基础知识:

  1. 如果你使用React.FC&lt;DataType&gt;DataType会自动应用到组件的props,但是你已经在ModalComponent中做了props:any,这样可以绕过编译问题,但是会破坏以后的事情。因此,请将 props:any 更改为 props

提示:只需将鼠标悬停在 VSCode 中的 props 上,智能感知就会显示它的数据类型

  1. 您在App.tsx 中使用AppProps 作为React.FC&lt;AppProps&gt;,如果您将其更改为const App: React.FC&lt;AppProps&gt; = (props) =&gt; {...},并再次将鼠标悬停在props 上,您可以看到智能感知功能非常神奇,但因为它没有在任何地方使用在代码中,您可以将其删除。

现在回到核心问题,如果您将鼠标悬停在 props 上,您可以看到它包含的内容,它只会包含 props: AppProps,它不会在您的代码中的任何地方使用。

改为:

interface ModalComponentProps {
   modalVisible: boolean
   itemSelected: any // you have set any in App.tsx
   handlerConfirmDelete: () => void
    
}

它应该可以工作。我仍然认为styles 会有问题,因为我不知道它是从哪里导入的。 ?

我建议使用object 而不是any,或者使用object 之上的自定义界面。 any 现在会让事情变得容易,以后会咬你。

【讨论】:

  • 感谢您的帮助 Samridh!每个 .tsx 上都有样式组件,我只是没有将它们添加到问题中。
  • 酷,不客气!不需要的提示:如果 typescript 在编译期间给您带来问题......这就是它的设计目的?它应该在生产之前捕获这些问题,所以尽量避免any。还有其他数据类型,如 objectunknownnever 等,您应该探索一下?
猜你喜欢
  • 2020-06-03
  • 2022-12-05
  • 2020-06-13
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
相关资源
最近更新 更多