来自自定义组件的 React Native Change State

Posted

技术标签:

【中文标题】来自自定义组件的 React Native Change State【英文标题】:React Native Change State from Custom Component 【发布时间】:2018-09-30 21:18:48 【问题描述】:

我有自定义选择器组件,我想更新 selectedValue 和 onValueChange 事件的状态。如果我直接在渲染部分添加选择器,它工作正常,但由于代码重复,我决定将我的选择器转换为自定义组件。所以我这样做了:

    import React,  Component  from 'react';
import 
    StyleSheet,
    View,
    Modal,
    ActivityIndicator
 from 'react-native';
import  Item, Picker  from 'native-base'

const CustomPicker = props => 
    const 
        pickerLabel,
        selectedVal,
        onChangeVal,
        pickerStyle,
        pickerData,
        ...attributes
     = props;

    return (
        <Picker
            selectedValue=selectedVal
            style=[pickerStyle]
            onValueChange=(itemValue, itemIndex) => this.setState(onChangeVal: itemValue)>
            <Picker.Item label=pickerLabel value=''/>
            pickerData.map((item, key) => (
                <Picker.Item label=item value=item key=key/>)
            )
        </Picker>
    )


const styles = StyleSheet.create(

);

export default CustomPicker;

我像这样调用不同的组件:

<CustomPicker pickerLabel="Select User" selectedVal=this.state.selectedUser pickerStyle=styles.picker pickerData=this.state.userList onChangeVal=this.state.selectedUser />

标签 + 数据很好地填充到选择器中,但问题出现在事件上。它没有更新拾取数据的状态,我错过了什么?

【问题讨论】:

【参考方案1】:

您需要在父组件中创建一个函数来更改值,因为您试图更改 stateless component 中的 state

相反,你需要做的是

父组件

onChange = (itemValue, itemIndex) => 
  // Set the state here and update as required


<CustomPicker pickerLabel="Select User" selectedVal=this.state.selectedUser pickerStyle=styles.picker pickerData=this.state.userList onChangeVal=this.onChange />

子组件

onValueChange=onChangeVal>

对于多个选择器:

父组件

state = 
  user: [
         value: 'Something', key: 0, label: 'Select User', userList: [//...Some Array here],
         value: 'Something Else', key: 1, label: 'Dont Select User', userList: [//...Some Array here]
    ]


onChange = (itemValue, itemIndex, pickerIndex) => 
      // Update the states based on the pickerIndex
    

const user = this.state

// Use a map here

user.map((data, index) => (
      <CustomPicker key=index index=index pickerLabel=data.label selectedVal=data.value pickerStyle=styles.picker pickerData=data.userList onChangeVal=this.onChange />
))

子组件

const 
        index, <== Picker Index
        pickerLabel,
        selectedVal,
        onChangeVal,
        pickerStyle,
        pickerData,
        ...attributes
     = props;

<Picker
            selectedValue=selectedVal
            style=[pickerStyle]
            onValueChange=(itemValue, itemIndex) => this.props.onChangeVal(itemValue, itemIndex, index)> <== Pass picker value to the parent 

【讨论】:

有没有其他方法可以做到这一点,而无需制定方法。因为我在屏幕上有 8-9 个选择器,并且通过使用您的方法,我必须制作 8-9 个方法。 你不需要做8个9的方法,你可以在initialState中做一个值数组,并根据当前选择的Picker的索引来更新它们 我不喜欢这种方法。还有什么办法吗?我可以直接作为道具传递给组件吗 你总是可以直接作为 props 传递给组件,但不能更新它,因为值需要传递给父组件。其他方法是使用 redux。 您能详细说明一下如何处理具有多个状态的多个选择器吗? onChange 方法如何区分不同的选择器,你能提供一个例子吗?

以上是关于来自自定义组件的 React Native Change State的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义输入组件时的 React-Native 不变违规

如何在 react-native 中为 webView 请求设置自定义标头

Wix React-Native-Navigation:自定义组件按钮的 onPress

React-Native:将焦点设置到由数组构建的自定义组件

无法在 React-native 中更改自定义组件的宽度和高度?

自定义 React Native UI 组件:Invariant Violation