【问题标题】:How to make react-native Picker stay at newly selected option?如何让 react-native Picker 停留在新选择的选项?
【发布时间】:2016-10-02 12:48:19
【问题描述】:

我现在正在 iOS 上测试一个选择器,有两个选项。每次我从第一个选项往下拖到第二个选项,选择器立即回到第一个选项。

这就是我的选择器代码的样子。

<Picker 
      style={{
        width: 100,
      }}
      selectedValue={(this.state && this.state.pickerValue) || 'a'}
      onValueChange={(value) => {
        this.setState({value});
      }} itemStyle={{color: 'white'}}>
      <Picker.Item label={'Hello'} value={'a'} />
      <Picker.Item label={'World'} value={'b'} />
</Picker>

我希望选择器停留在新滚动到的选项上。我还删除了selectedValue 属性的|| 'a' 部分,但这也没有解决问题。

【问题讨论】:

  • 将 onValueChange 改为 this.setState({pickerValue: value});

标签: javascript ios reactjs react-native


【解决方案1】:

在值更改时,您需要指定状态的哪个属性发生更改,并使用 this.setState

进行相应更改
onValueChange={(value) => {this.setState({pickerValue: value});

完整代码

<Picker 
      style={{
        width: 100,
      }}
      selectedValue={(this.state && this.state.pickerValue) || 'a'}
      onValueChange={(value) => {
        this.setState({pickerValue: value});
      }} itemStyle={{color: 'white'}}>
      <Picker.Item label={'Hello'} value={'a'} />
      <Picker.Item label={'World'} value={'b'} />
</Picker>

【讨论】:

  • 您知道如何为功能组件执行此操作吗?没有State 的?
  • 这里我有一个状态值和另一个值作为组件的道具传递(即)如果用户直接来到屏幕,它需要显示默认值,它应该允许用户选择另一个价值观。同理,如果用户将一个屏幕中的值传递给选取器,它需要显示更改后的值,并且还需要允许用户在选取器中选取其他值
  • @KaranAsthana 功能组件确实通过useState API 使用状态。您要查找的术语可能是无状态组件。
【解决方案2】:

我刚刚遇到这个并且面临同样的问题,滚动到达新项目并重置到第一个项目。 我已经使用无状态组件(Hooks)做到了这一点:

我有一个对象数组作为选项作为

const data = useState({
"options":[{
"name":"Dish 1","price":0},{"name":"Dish 2","price":0}]})

const [selected, setSelected] = useState(0)

Picker 组件:

<PickerIOS
    selectedValue={selected_choice}
    onValueChange={(value, index) => {
            set_selected_choice(index)
          }}
        >
          {data?.map((item, index) => (
            <PickerIOS.Item
              key={item}
              value={index}
              label={item.name}
            />
          ))}
</PickerIOS>

在这里,我已经存储了处于选中状态的数组元素的索引,并从 PickerIOS 项中对其进行了更新,将 value 保持为 index

【讨论】:

    【解决方案3】:

    我使用了这个“黑客”:

    render() {
        const values = ['1', '2'];
    
        return (
          <Picker
            value={this.state.value}
            onValueChange={this.onValueChange.bind(this)}
          >
          {
                    <Picker
                        value={this.state.value}
                        onValueChange={this.onValueChange.bind(this)}
                    >
                    {
                        [<Picker.Item
                            label="n/a"
                            value={null}
                        />].concat(values.map(value => {
                                return (
                                    <Picker.Item
                                        label={value}
                                        value={value}
                                    />
                                )
                                })
                        ) 
                    }
                    </Picker>
        );
      }
    

    【讨论】:

    • 虽然答案总是很受欢迎,但这个问题是在 一年 前提出的,并且已经有了一个公认的解决方案。请尽量避免通过提供答案来将问题“颠倒”到顶部,除非该问题尚未标记为已解决,或者您找到了针对该问题的新的和改进的解决方案。还记得提供一些context surrounding your code 来帮助解释它。查看writing great answers 上的文档,了解如何让您的答案发挥作用的一些提示:)
    • 这是推荐的缩进吗?我是 React-Native 的新手,只是问问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多