【问题标题】:Picker onValueChange not being called on every selection选择器 onValueChange 不会在每个选择上被调用
【发布时间】:2017-12-30 18:07:55
【问题描述】:

我有一个带有一些硬编码值的选择器。在值更改时,我想使用我商店中的操作创建器函数使用所选值更新我的 redux 商店。我遇到了一个问题,但是每次选择更改似乎都没有调用 onValueChange 侦听器。

选择器代码

<Picker selectedValue={this.props.settings.colorScheme} 
  onValueChange={(value, itemIndex) => this.props.onValueChange({prop: 'colorScheme', value})}>
  <Picker.Item value="blue" label="Blue"/>
  <Picker.Item value="green" label="Green"/>
  <Picker.Item value="orange" label="Orange"/>
  <Picker.Item value="purple" label="Purple"/>
  <Picker.Item value="red" label="Red"/>
</Picker>

传递给组件以处理值更改的方法。我在这里设置了断点,但它们通常只针对其他所有选择触发。从蓝色开始,然后选择它触发的橙色。然后选择绿色,它不会触发,然后选择红色,它会再次触发。

handleValueChange({prop, value}) {
    this.props.updateSettings({prop, value})
}

这是我的 redux 动作创建器

export function updateSettings ({prop, value}) {
  return {
    type: UPDATE_SETTINGS,
    payload: ({ prop, value }),
  }
}

我的渲染方法(onValueChange 变成了 handleValueChange)

render() {
  return (
    <Settings
    settings={this.props.settings}
    onValueChange={this.handleValueChange.bind(this)}
    />
  )
}

【问题讨论】:

标签: react-native


【解决方案1】:

我使用componentDidUpdate 找到了以下解决方法:

export default class PickerComponent extends PureComponent {
  constructor (props) {
    super(props)
    this.state = {value:this.props.eventId}
  }

  componentDidUpdate () {
    if (this.props.eventId !== this.state.value) {
      this.props.chooseEvent(this.state.value)
    }
  }

  onValueChange = value => {
    if (value) this.setState({value})
  }

  makePickerItem (label, key) {
    const props = {label, key, value:key}
    return <Picker.Item {...props} />
  }

  makePickerItems = function * () {
    for (let id in this.props.things) {
      yield this.makePickerItem(this.props.things[id].name, eventId)
    }
  }

  render () {
    return (
      <Picker
        selectedValue={this.state.value}
        onValueChange={this.onValueChange}
      >
        {[...this.makePickerItems()]}
      </Picker>
    )
  }
}

【讨论】:

  • 目前仍然是 Picker 组件的问题。今天有人提出了一个更简单的解决方法,可能会有趣地更新您在 github 相关问题中的答案(我看到您在那里发表评论):github.com/facebook/react-native/issues/…
  • 在我的情况下,onValueChange 没有使用从父级传递下来的函数调用。这就是我以这种方式解决它的原因。但是感谢您的链接,它可能对其他人有用。
猜你喜欢
  • 2019-08-07
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多