当前位置: 首页 > 知识库问答 >
问题:

useState钩子不在onPress()函数中更新我的状态

蔺山
2023-03-14

我正在构建一个制表符视图,我不明白为什么useState钩子没有更新我的状态。我肯定这是件容易的事,但我在这里已经被难住了一段时间...

我可以看到onPress函数已启动,如果我注销,则item.label是正确的。但是,即使我硬编码参数,setState也不会更改。

const TabContainer = ({ tabs }) => {
  const [selected, setSelected] = useState('');

function renderItem(item, index) {
    return item.label === selected ? (
      <View style={styles.selectedTab}>
        <CustomText style={styles.tabText}>{item.label}</CustomText>
      </View>
    ) : (
      <TouchableWithoutFeedback
        key={index}
        onPress={() => {
          console.log(selected);
          setSelected(item.label);
        }}
      >
        <View style={styles.tab}>
          <CustomText style={styles.tabText}>{item.label}</CustomText>
        </View>
      </TouchableWithoutFeedback>
    );
  }

  return (
    <View style={styles.tabContainer}>
      <FlatList
        keyExtractor={(item, index) => index.toString()}
        data={tabs}
        renderItem={({ item, index }) => {
          return renderItem(item, index);
        }}
        style={styles.listContainer}
      />
    </View>
  );
};

export default TabContainer;

共有3个答案

松旭
2023-03-14

好吧,我解决了这个问题。我意识到我必须提升选项卡的状态,以便正确渲染其他内容。然后我在父组件中以同样的方式实现,然后它就工作了。。。

来自父级的重要行:

  const [selectedTab, setSelectedTab] = useState('');

  function handleTabPress(tab) {
    setSelectedTab(tab);
  }

...

<TabContainer
  tabs={[
    { label: 'Label 1' },
    { label: 'Label 2' },
    { label: 'Label 3' },
  ]}
  selectedTab={selectedTab}
  handleTabPress={handleTabPress}
/>

新生儿

const TabContainer = ({ tabs, selectedTab, handleTabPress }) => {
  function renderItem(item, index) {
    return item.label === selectedTab ? (
      <View style={styles.selectedTab}>
        <CustomText style={styles.selectedTabText}>{item.label}</CustomText>
      </View>
    ) : (
      <TouchableWithoutFeedback
        key={index}
        onPress={() => {
          handleTabPress(item.label);
        }}
      >
        <View style={styles.tab}>
          <CustomText style={styles.tabText}>{item.label}</CustomText>
        </View>
      </TouchableWithoutFeedback>
    );
  }
  return (
    <View style={styles.tabContainer}>
      <FlatList
        keyExtractor={(item, index) => index.toString()}
        data={tabs}
        renderItem={({ item, index }) => {
          return renderItem(item, index);
        }}
        style={styles.listContainer}
      />
    </View>
  );
};
艾俊晖
2023-03-14

有时,当您希望在生命周期中与构造函数不同的阶段设置值时,使用useRef而不是useState。请查看这一点,并尝试在代码中实现这一点:[https://codesandbox.io/s/v6948pww5y?from-嵌入]

邓禄
2023-03-14

试试这个:

<

TouchableWithoutFeedback
        key={index}
        onPress={() => onPressItem(item)}
      >
const onPressItem =(item)=>{
setSelected(item.label)}
 类似资料:
  • 我有一个对象的状态数组: 我有一个添加按钮,用于将对象添加到数组中,这是onclick事件的主体:

  • 在基于类的React组件中,我们可以使用setState的函数形式定义处理函数,例如: 其中,两个参数表示传递给此组件的先前状态和更新的道具。 类似地,我们有一个函数形式,使用useState钩子在函数组件中设置状态,如下所示: 但正如我们所看到的,useState钩子中的函数形式缺少表示更新的道具的第二个参数 这是React开发团队故意留下的吗?在useState钩子中设置状态时,我们如何访问更

  • 我正在React中使用useState钩子,状态将不会在

  • 我不熟悉React钩子和React 16.13.1。 我将实现能够处理登录的Auth组件。 但是它似乎没有正确更新状态,即使使用响应对象调用。 这个代码有什么问题?

  • 我真的很喜欢新的React钩子,我经常在我正在做的项目中使用它们。我遇到了一种情况,我想在hook中使用prevState,但我不确定如何做到这一点。 我尝试过类似的东西,但它无法编译。 (顺便说一句,这是映射一组复选框,以跟踪打了复选标记的复选框) 我试图在这里遵循这个例子,但是不使用setState函数。 谢谢你的帮助!

  • 问题内容: 我发现React Hooks文档的这两部分有些令人困惑。使用状态挂钩更新状态对象的最佳实践是哪一种? 想象一下要进行以下状态更新: 选项1 从使用React Hook的文章中,我们可以做到: 所以我可以做: 然后: 选项2 从钩子参考中我们可以得出: 与类组件中的setState方法不同,useState不会自动合并更新对象。您可以通过将函数更新程序形式与对象传播语法结合使用来复制此行