【问题标题】:Passing props to Modal (React Native)将 props 传递给 Modal (React Native)
【发布时间】:2021-03-17 14:27:05
【问题描述】:

我正在尝试将道具从平面列表传递到模态屏幕,我已经尝试了所有可能的方法来完成这项工作,但我似乎不明白。当我尝试传递道具时,它说它无法将状态更新为只读属性

这里是 useEffect 和 useState

const [proops, setProops] = useState([]);
const [passedProps, setPassedProps] = useState('');

 useEffect(() => {
     const onChildAdd = database().ref('/User/').on('value', function(snapshot) {
   
       const props= [];
       snapshot.forEach(function(userSnapshot) {
       const id = userSnapshot.key;
       const userData = userSnapshot.val();
       
       userData['uid'] = id;
       proops.push(userData);
       
       });
       setProops(proops);
        
       
       });
       
           
        return () =>
           database().ref('/User/' )
               .off('value', onChildAdd);
       
   
   }, [props])

这是平面列表

       <FlatList
data={proops}
ItemSeparatorComponent={() => <Divider />}
keyExtractor={item => item.id}
ListEmptyComponent={() => <ActivityIndicator/> }
renderItem={({ item }) => (
<View style={{flex: 1,  width: '100%', justifyContent: 'flex-start',  alignItems: 'center', color: 'black'}}>

<View style={{flex: 18,  width: '100%', justifyContent: 'flex-start', color: 'black'}}>
<TouchableOpacity onPress={() => setModalVisible(true)}
  
>
        <List.Item title={item.Name} description='Click to open the modal' 
          titleNumberOfLines={1}
    titleStyle={styles.listTitle}
    descriptionStyle={styles.listDescription}
    descriptionNumberOfLines={1}
    onPress={() => setPassedProps(item.Name)}
        />
        </TouchableOpacity>
      
      
</View>
</View>
)}
/>

这里是模态

 <Modal
        animationType="slide"
        transparent={true}
        visible={modalVisible}
        
      >
        <View style={styles.centeredView}>
          <View style={styles.modalView}>

            <TouchableOpacity
              style={{ ...styles.openButton, backgroundColor: "#2196F3" }}
              onPress={() => {
                setModalVisible(!modalVisible);
              }}
            >
              <Text style={styles.textStyle}>Hide Modal</Text>
            </TouchableOpacity>

        <Text>{passedProps}</Text>    
</View>
</View>
)}
/>
 </View>
</View>
      </Modal>

错误

*TypeError: 试图分配给只读属性。 *

当我点击平面列表中的项目时会发生这种情况

【问题讨论】:

  • 如果你也给我们只读属性的名称会有所帮助
  • 问题来自 onPress={() => setPassedProps(item.Name)}
  • 添加一个SS的错误?
  • 在flalist的
  • 我认为这与您的模态无关。检查您的 firebase 代码以查看您对快照的操作。

标签: javascript arrays reactjs react-native react-native-flatlist


【解决方案1】:

问题可能是您添加了太多的侦听器。应仅在组件加载后添加侦听器。

useEffect(() => {
     const onChildAdd = database().ref('/User/').on('value', function(snapshot) {
   
       //const props= []; <<< not sure why you would want to do this.
       snapshot.forEach(function(userSnapshot) {
       const id = userSnapshot.key;
       const userData = userSnapshot.val();
       
       userData['uid'] = id;
       proops.push(userData);
       
       });
       setProops(proops);
       });
       
           
        return () =>
           database().ref('/User/' )
               .off('value', onChildAdd);
   }, []) // <<< you want to just add one listener for your list of user. [] means only run this once when component mounts. 

【讨论】:

  • 我添加了顶部声明以防止渲染添加到新列表中,相反,当有更改时,它会删除以前的列表并设置一个新列表
  • 为什么要删除整个列表而不是只渲染新项目?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2023-03-08
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多