簡體   English   中英

避免在重新渲染父對象時失去對TextInput的關注?

[英]Avoid losing focus of TextInput when parent is rerendered?

我的屏幕上有一個FlatList子級。 該子級包含幾個TextInputs和一些樣式。 我想在TextInputs的OnTextChange-功能中更新父狀態。 但是,在我當前的實現中,每當我在任何TextInputs中鍵入一個字符時,我都會失去焦點(鍵盤被關閉)。

如果我嘗試在父屏幕中創建TextInput並更新每個onChangeText上的狀態,則一切正常。

這是我的代碼(刪除了一些不重要的視覺組件):

UserInfoScreen.js

const onChangeText = (setUserInfo, userInfo) => (backendLabel, text) => {
  console.log(backendLabel, text);
  setUserInfo({ ...userInfo, [backendLabel]: text });
};

const UserInfoScreen = () => {
  const { state } = useContext(AuthContext);
  const [isEditing, setIsEditing] = useState(false);
  const [userInfo, setUserInfo] = useState({
    firstName: '',
    lastName: '',
    email: '',
    phoneNr: '',
  });

...

  return (
    <View style={styles.root}>
      <SeparatedList
        onChangeText={onChangeText(setUserInfo, userInfo)}
        editable={isEditing}
        style={styles.list}
        content={[
          {
            label: 'FirstName:',
            text: userInfo.firstName,
            backendLabel: 'firstName',
          },
          {
            label: 'LastName:',
            text: userInfo.lastName,
            backendLabel: 'lastName',
          },
          { label: 'Email:', text: userInfo.email, backendLabel: 'email' },
          { label: 'Mobile:', text: userInfo.phoneNr, backendLabel: 'phoneNr' },
        ]}
      />
    </View>
  );
};

SeparatedList.js

const SeparatedList = ({ content, style, editable = false, onChangeText }) => {
  return (
    <View style={{ ...style }}>
      <FlatList
        bounces={false}
        data={content}
        renderItem={({ item }) => {
          return (
            <View style={styles.textContainer}>
              <CustomText style={styles.label}>{item.label}</CustomText>
              <TextInput
                editable={editable}
                onChangeText={text => onChangeText(item.backendLabel, text)}
              >
                <CustomText style={styles.text}> {item.text}</CustomText>
              </TextInput>
            </View>
          );
        }}
        ItemSeparatorComponent={() => <ListSeparator />}
        contentContainerStyle={styles.container}
        keyExtractor={it => `${it.label} ${Math.floor(Math.random() * 1000)}`}
      />
    </View>
  );
};

我修好了它。 在那排

keyExtractor={it => `${it.label} ${Math.floor(Math.random() * 1000)}`}

當我改用以下代碼時它起作用了:

keyExtractor={(item, index) => index.toString()}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM