【发布时间】: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