【问题标题】:is there way to check and unchecked the "check-boxes" from my example?有没有办法从我的例子中检查和取消选中“复选框”?
【发布时间】:2020-01-01 07:35:19
【问题描述】:

这是我尝试选中和取消选中“复选框”的示例,但我感到困惑,如果有人告诉我应该如何完成,我会很高兴。

import React, { useState } from 'react';
import { View, Text, StyleSheet } from 'react-native';
import { CheckBox } from 'react-native-elements';

const NewPlaceScreen = props => {
 const [checked, setChecked] = useState(false);


 return (
     <View>
         <CheckBox
             iconRight
             right
             title="apple"
             checked={checked}
             onPress={() => setChecked(true)}
         />
         <CheckBox
             iconRight
             right
             title="kiwi"
             checked={checked}
             onPress={() => setChecked(true)}
         />
     </View>
 );

};

NewPlaceScreen.navigationOptions = {
 headerTitle: 'viewsqq'
};

const styles = StyleSheet.create({
 TextStyle: {
     fontWeight: 'bold',
     color: 'grey'

 }
});

export default NewPlaceScreen

这就是我上面的例子

【问题讨论】:

    标签: javascript react-native checkbox element react-hooks


    【解决方案1】:

    您需要在按下时将它们设置为与之前状态相反的状态。您可以使用 setState 回调来做到这一点:

    onPress={() => setChecked(prev => !prev)}
    

    目前,您的复选框都使用相同的状态变量checked,因此它们将保持同步 - 更改一个会更改另一个。如果这不是您想要的,您应该为每个复选框创建一个单独的状态变量。


    更新:

    要独立对待每个复选框,您需要为每个复选框创建状态:

    const [isAppleChecked, setIsAppleChecked] = useState(false)
    const [isKiwiChecked, setIsKiwiChecked] = useState(false)
    
    return (
      <View>
        <CheckBox
          iconRight
          right
          title="apple"
          checked={isAppleChecked}
          onPress={() => setIsAppleChecked(prev => !prev)}
        />
        <CheckBox
          iconRight
          right
          title="kiwi"
          checked={isKiwiChecked}
          onPress={() => setIsKiwiChecked(prev => !prev)}
        />
      </View>
    )
    

    【讨论】:

    • 但是如果我按照你说的那样做,它会同时选中和取消选中它们..如果我只想选中第一个复选框,那么只有它应该被选中,而不是全部一起选中。你能给我指路吗?
    【解决方案2】:

    您需要为每个框设置单独的状态,否则它们将始终显示相同的内容。您需要将新状态设置为与旧状态相反:

    const NewPlaceScreen = props => {
      const [appleChecked, setAppleChecked] = useState(false);
      const [kiwiChecked, setKiwiChecked] = useState(false);
    
      return (
        <View>
          <CheckBox
            iconRight
            right
            title='apple'
            checked={appleChecked} // use the apple-specific state
            onPress={() => setAppleChecked(prevState => !prevState)} // use the new apple state function
          />
          <CheckBox
            iconRight
            right
            title='kiwi'
            checked={kiwiChecked} // use the new kiwi state
            onPress={() => setKiwiChecked(prevState => !prevState)} // use the new kiwi function
          />
        </View>
      );
    };
    

    【讨论】:

    • 在设置setAppleChecked 时不应引用当前状态。如果新状态依赖于之前的状态,请使用 setState 回调。
    • 我觉得还可以。这是官方文档中的示例:reactjs.org/docs/hooks-state.html
    • 对不起,我的意思是你应该将一个函数传递给 setState,而不是传递一个对象。 React 批处理状态更新,因此在 React 实际尝试更新它时状态可能已经改变,这意味着您传入的状态是陈旧的。请在此处阅读文档:reactjs.org/docs/…
    • 由于某种原因,您链接到的官方文档中的示例没有考虑到这个问题。我不知道为什么,但是我链接的文档确实说明了这一点,并明确声明不要这样做。如果我有一组文档使用当前状态而没有提及它可能存在的缺陷,而另一组文档明确说明了这些缺陷并展示了如何避免它们,我会相信后者。
    • 你是对的......似乎这是一个更好的做法。我想我链接到的文档是状态钩子的介绍,所以他们想保持简单?不过,如果它是错误的,那么他们应该更新它^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多