【问题标题】:change Icon after clicking on it点击后更改图标
【发布时间】:2020-08-04 08:30:11
【问题描述】:

我有一个如下所示的组件:

const criteriaList = [
  'Nur Frauen',
  'Freunde Zweiten Grades',
];

export const FilterCriteriaList: React.FunctionComponent = () => {
  const [state, setState] = useState(false);

  useEffect(() => {
    console.log('state is,', state);
  });

  const myFunction = () => {
    console.log('checking state', state);
    if (state == false) {
      setState(true);
    } else {
      setState(false);
    }
  };

  return (
    <View style={styles.container}>
      <View style={styles.horizontalLine} />
      {criteriaList.map((item: string, index: number) => (
        <View key={index}>
          <View style={styles.criteriaRow}>
            <TouchableOpacity 
              onPress={() => {
                myFunction();
              }}>
              <Icon
                name="circle-thin"
                color="#31C283"
                size={moderateScale(20)}
              />
            </TouchableOpacity>
            <Text style={styles.text}>{item}</Text>
          </View>
          
          <View style={styles.horizontalLine} />
        </View>
      ))}
    </View>
  );
};

目前,我使用的是圆形细图标。我想更改它,以便每次单击图标时,它都会更改为 dot-circle-o 图标。像单选按钮。但是,我不太确定该怎么做。

我曾想过使用三元运算符,但由于我正在映射我的字段 Idk 如何集体设置状态。也许使用索引?我不想为每个字段创建单独的状态。这是一个类似的小吃演示:

https://snack.expo.io/toTSYc2fD

我希望能够选择多个/取消选择选项。我不想在所有字段上同时应用相同的规则。

注意:onPress 函数也可以直接在 Icon 上使用,而不是 TouchableOpacity(虽然不是首选)

【问题讨论】:

    标签: javascript reactjs typescript react-native react-hooks


    【解决方案1】:

    对我来说,使用三元组听起来是正确的方法。你能不能做这样的事情:

    name={state ? 'dot-circle-o' : 'circle-thin'}
    

    你也可以重构你的函数:

     const myFunction = () => {
        console.log('checking state', state);
        setState(!state)
     };
    

    如果您有多个字段,那么有很多方法可以处理它。您可以多次拨打useState,例如:

    const [field1, setField1] = useState(false);
    const [field2, setField2] = useState(false);
    

    您还可以将所有字段存储在相同的状态:

    const [state, setState] = useState({field1: false, field2: false});
    
    ...
    
      const myFunction = (fieldName) => {
        console.log('checking state', state);
        setState({...state, [fieldName]: !state[fieldName]})
      };
    

    我猜你会使用 item 作为“fieldName?在这种情况下:

    return (
        <View style={styles.container}>
          <View style={styles.horizontalLine} />
          {criteriaList.map((item: string, index: number) => (
            <View key={index}>
              <View style={styles.criteriaRow}>
                <TouchableOpacity 
                  onPress={() => {
                    myFunction(item);
                  }}>
                  <Icon
                    name={state[item] ? 'dot-circle-o' : 'circle-thin'}
                    color="#31C283"
                    size={moderateScale(20)}
                  />
                </TouchableOpacity>
                <Text style={styles.text}>{item}</Text>
              </View>
              
              <View style={styles.horizontalLine} />
            </View>
          ))}
        </View>
      );
    

    并创建初始状态:

    const initialState = {}
    criteriaList.forEach(item => initialState[item] = false)
    const [state, setState] = useState(initialState);
    
    

    【讨论】:

    • 但是我将如何设置状态?我希望能够选择多个/取消选择选项。这会将相同的规则应用于所有字段。
    • 似乎是一个好方法。您能否还添加我如何直接在 onPress 上传递文件名?另外,我将如何在三元运算符中检查它?
    • 那么,在useState({field1: false, field2: false}) 我应该使用字段名(字符串)作为字段1 字段2 等?
    • 更新设置初始状态
    【解决方案2】:

    代码如下所示。 您必须将所选项目的索引设置为状态并使用它来选择图标。

    const criteriaList = [
      {title:'My List',checked:false},
      {title:'Friends listt',checked:false},
      {title:'Not Good',checked:false},
      {title:'Sweet and sour',checked:false},
      {title:'Automatic',checked:false},
    ];
    
    export const FilterCriteriaList: React.FunctionComponent = () => {
      const [state, setState] = useState(criteriaList);
    
      useEffect(() => {
        console.log('state is,', state);
      });
    
      const myFunction = (index) => {
        console.log('checking state', state);
        const arr=[...state];
        
        arr[index].checked=arr[index].checked?false:true;
        setState(arr);
        
      };
    
      return (
        <View style={styles.container}>
          <View style={styles.horizontalLine} />
          {criteriaList.map((item: Any,index:number) => (
            <View key={item}>
              <View key={item} style={styles.criteriaRow}>
    
                  <Icon 
                    style={styles.icon}
                    name={item.checked?"circle":"circle-thin"}
                    color="#31C283"
                    size={moderateScale(20)}
                    onPress= {()=>myFunction(index)}
                  />
                <Text style={styles.text}>{item.title}</Text>
              </View>
              
              <View style={styles.horizontalLine} />
            </View>
          ))}
        </View>
      );
    };
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2015-12-03
    • 2017-07-12
    相关资源
    最近更新 更多