【问题标题】:React Native Picker Select: How to auto-select an item but still be able to select others?React Native Picker Select:如何自动选择一个项目但仍然能够选择其他项目?
【发布时间】:2020-06-24 14:07:04
【问题描述】:

我在我的 React Native 应用程序中使用 RNPickerSelect。我想要三个选项:ABC。我希望默认选择A(就像在国家选择器列表中默认选择USA 一样)。这是我尝试过的:

<RNPickerSelect
  value={{label: 'A', value: 'A'}}
    items={[
      { label: 'A', value: 'A' },
      { label: 'B', value: 'B' },
      { label: 'C', value: 'C' },
    ]}
  onValueChange={value => {}}
/>

默认情况下这确实选择了A,但问题是它不允许您在之后选择任何其他人。

我应该如何处理这个问题?

【问题讨论】:

    标签: reactjs react-native picker react-native-picker-select


    【解决方案1】:

    首先制作一个组件状态

    class DropDown extends Component {
       constructor() {
          this.state = {
              dropdownValue: 'A'
          }
       }
       
       handleDropdownChange = (name) => (value) => {
          this.setState({ [name]: value })
       }
       
       render() {
          const { dropdownValue } = this.state  
    
          return (
             <RNPickerSelect
                value={dropdownValue}
                items={[
                  { label: 'A', value: 'A' },
                  { label: 'B', value: 'B' },
                  { label: 'C', value: 'C' },
                ]}
                onValueChange={this.handleDropdownChange('dropdownValue')}
             />
          )
       }
    }
    

    【讨论】:

    • 这就是诀窍!我希望能够在不带状态的情况下做到这一点,但我认为这是最有效的方式。
    【解决方案2】:

    这对我有用:

    使用选项overflow: 'hidden'

    将属性“pickerProps”添加到RNPickerSelect
    <RNPickerSelect style={styles.selectContainer}
                    ...
                    pickerProps={{ style: { height: 214, overflow: 'hidden' } }}
                    ...
                />
    

    【讨论】:

      【解决方案3】:

      如果您希望选择器显示选择的第一个项目。您可以简单地将空对象传递给占位符。参考了这个docs

      <RNPickerSelect
      placeholder={{}}
      items={[
        { label: 'A', value: 'A' },
        { label: 'B', value: 'B' },
        { label: 'C', value: 'C' },
      ]}
      onValueChange={value => {}}
      

      />

      同时你可以有一个状态变量,它选择了第一个项目,你在 onValueChange 中使用它

      例如:

      const [selected, setSelected] = useState('A');
      
      <RNPickerSelect 
      placeholder={{}}
      items={[
      { label: 'A', value: 'A' },
      { label: 'B', value: 'B' },
      { label: 'C', value: 'C' },
      ]}
       onValueChange={value => setSelected(value)}
      />
      

      注意:您将无法添加任何占位符。您可以在组件上方添加标签:)

      【讨论】:

        【解决方案4】:

        只是想分享在设置我的选择器组件并遇到相同问题时对我有用的方法。

        在下面的示例中,useEffect 将初始选择器值设置为第二个选项。

        export default function ContactPicker({ contacts, contact, setContact, setNewState }) {
        
          useEffect(() => {
            contacts?.length > 1 && setContact(contacts[1]['id'])
          }, [contacts])
        
          return (
            <View>
              <Picker
                selectedValue={contact}
                onValueChange={(itemValue, itemPosition) => {
                  setContact(itemValue)
                  setNewState(prev => ({ ...prev, contact_id: itemValue }))
                }}
              >
                {contacts?.map((contact, index) => (
                  <Picker.Item
                    key={index}
                    label={contact.name}
                    value={contact.id}
                  />
                ))}
              </Picker>
            </View>
          )
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-19
          • 2019-09-29
          • 1970-01-01
          • 2017-08-13
          • 1970-01-01
          • 2016-10-02
          • 2018-12-21
          • 2021-12-14
          相关资源
          最近更新 更多