从使用 react native 中的 map 函数渲染的组件的父级调用子方法

埃利亚斯·班达拉

我正在构建一个表单,它根据字段的 json 定义插入字段,解析 json 对象并将其传递给 switch 语句,该语句选择适当的小部件并将其插入到数组中,然后对该数组进行排序,然后使用数组映射呈现我需要的内容要实现的是在按下提交后调用每个字段的验证字段 现在我如何访问此元素并调用适当的验证逻辑

到目前为止我尝试过的

  1. 当我将小部件推入数组时使用 refs 抛出与在渲染函数之外分配 refs 相关的错误
    1. 将 map 调用包装在引用视图中,并通过this.refs["myWrapper].props.children这种方法访问作为该视图的子项的小部件使我可以访问我的小部件,但返回的对象不包含我的方法,因此调用它们会抛出错误,因为它不是函数

代码示例

`导出类 myForm 扩展组件{

constructor(props){
    super(props);
    this.fields=[];
}

getFields(fields){

 let {formName,title}=this.props;

    let field,_fields=[],item;

    fields= this.sortFieldsOrder(fields);


    fields.forEach((sect,i)=>{
        for(field in sect)
        {
            item=sect[field];
            switch (item.widget){

                case "inlineText":
                    _fields.push(
                        <EbTextInput  key={field}

                                     {...{...item.props,formName,title}}
                                     field={field}
                                     label={item.hasOwnProperty("label")?item.label:""}
                                     validator={item.hasOwnProperty("validator")?item.validator:()=>{}}
                        />
                    );

                    break;
                case "hidden":

                    _fields.push(
                        <EbHiddenInput  key={field}
                                       {...{...item.props,formName,title}}
                                       field={field}
                                       label={item.hasOwnProperty("label")?item.label:""}
                                       validator={item.hasOwnProperty("validator")?item.validator:()=>{}}
                        />
                    );
                    break;
                case"modal":
                    _fields.push(

                        <EbModalInput
                                      key={field}
                                      {...{...item.props,formName,title}}
                                      field={field}
                                      fields={item.props.fields instanceof Array?this.getFields(item.props.fields):[]}
                                      label={item.hasOwnProperty("label")?item.label:""}
                                      validator={item.hasOwnProperty("validator")?item.validator:()=>{}}
                        />

                    );
                    break;
                case"filePicker":

                  let  picker=<EbFilePickerInput key={field}
                                                 {...{...item.props,formName,title}}
                                                 field={field}
                                                 label={item.hasOwnProperty("label")?item.label:""}
                                                 validator={item.hasOwnProperty("validator")?item.validator:()=>{}}
                  />;
                    picker=[picker];

                    _fields.push(
                        <EbModalInput  key={field}
                                      {...{...item.props,formName,title}}
                                      field={field}
                                      fields={picker}
                                      label={item.hasOwnProperty("label")?item.label:""}
                                      validator={item.hasOwnProperty("validator")?item.validator:()=>{}}
                        />
                    );
                    break;
                case "option":
                    _fields.push(
                        <EbOptionInput

                            key={field}
                            {...{...item.props,formName,title}}
                            field={field}
                            fields={item.props.fields instanceof Array?this.getFields(item.props.fields):[]}
                            label={item.hasOwnProperty("label")?item.label:""}
                            validator={item.hasOwnProperty("validator")?item.validator:()=>{}}                            />
                    );
                    break;
                default:

            }


        }
    });
    return _fields;
}
sortFieldsOrder(arr){
    return  arr.sort((a,b)=>{
        let keyA=Object.keys(a)[0];
        let keyB=Object.keys(b)[0];
        if(a[keyA]["order"]<b[keyB]["order"])return 1;
        if(a[keyA]["order"]>b[keyB]["order"])return -1;
        return 0;
    });
}
componentWillMount(){

    let {fields}=this.props;
    this.fields=this.getFields(fields)

}
renderFields(){
   return this.fields.map((item)=>{
        return item;
    })
}
validateForm(){
    let field;
    let fields=this.refs["wrapper"].props.children;
    let status=true;
    React.Children.map(this.refs["wrapper"].props.children, (child) => {
        if(!child.validate()){
            status= false;
            console.log("valid form cheki");
            // break;
        }
    })



   return status;
}
render(){
    return(
        <View ref="wrapper" style={[styles.flex1]}>
            {this.renderFields()}
            <Button text="Submit" onPress={(e)=>{
                if(this.validateForm()){
                    //alert("valid form")
                }
                else
                    alert("invalid form")
            }}> </Button>
        </View>)
}

}

`

埃利亚斯·班达拉

在反应中,无论出于何种原因,它都是直接访问节点的蚂蚁模式,所以我决定使用 redux 遵循上面的第一条评论我可以发送验证信号并让每个小部件验证自己的状态,这减少了耦合并且易于实现和调试所以我会推荐每个有同样问题的人来关注这个通行证

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

无法使用Array.map在React中渲染数组

来自分类Dev

在React Native中渲染HTML

来自分类Dev

无法在React Native render()中运行.map()

来自分类Dev

从React-Native ListView行的子组件中调用父函数

来自分类Dev

在React Native中的组件之间进行通信(子->父)

来自分类Dev

从子级调用父组件的方法-React Native

来自分类Dev

在React Native中通过子组件更新父组件

来自分类Dev

如何在react-native中从子组件(带有参数)调用父函数?

来自分类Dev

从父组件渲染子组件或调用子组件的方法,反之亦然[React Native]

来自分类Dev

如何在React Native中在父级的``顶部''上下对齐子级组件?

来自分类Dev

react native-用react钩子通知子组件中状态更新的父组件?

来自分类Dev

如何在react中使用map渲染的组件列表中的特定组件进行修改?

来自分类Dev

在子组件中定义方法以使用ref hook-React Native Function Components

来自分类Dev

在React Native外部组件中调用函数

来自分类Dev

React Native:从类中调用功能组件内部的函数

来自分类Dev

React Native中的条件渲染

来自分类Dev

在React Native中渲染特定组件

来自分类Dev

如何使用Axios React Native在FlatList中渲染共振?

来自分类Dev

如何在React Native中不使用任何API调用的情况下重新渲染组件?

来自分类Dev

从其子级触发React父级功能组件中的函数

来自分类Dev

React中的Map函数

来自分类Dev

在React的子组件中调用父函数

来自分类Dev

React Native FlatList - 在返回组件的渲染方法中调用函数

来自分类Dev

React Native - 在子事件处理程序更新父状态后,子中的 .Map() 项目不会重新呈现

来自分类Dev

React Native 在渲染方法中调用函数

来自分类Dev

如何在 React Native 中使用函数渲染组件

来自分类Dev

在 React 中使用 map() 生成的组件中隐藏子组件

来自分类Dev

如何在 React Native 打字稿中从父级调用子组件方法

来自分类Dev

使用 .map react native 映射发送的道具

Related 相关文章

  1. 1

    无法使用Array.map在React中渲染数组

  2. 2

    在React Native中渲染HTML

  3. 3

    无法在React Native render()中运行.map()

  4. 4

    从React-Native ListView行的子组件中调用父函数

  5. 5

    在React Native中的组件之间进行通信(子->父)

  6. 6

    从子级调用父组件的方法-React Native

  7. 7

    在React Native中通过子组件更新父组件

  8. 8

    如何在react-native中从子组件(带有参数)调用父函数?

  9. 9

    从父组件渲染子组件或调用子组件的方法,反之亦然[React Native]

  10. 10

    如何在React Native中在父级的``顶部''上下对齐子级组件?

  11. 11

    react native-用react钩子通知子组件中状态更新的父组件?

  12. 12

    如何在react中使用map渲染的组件列表中的特定组件进行修改?

  13. 13

    在子组件中定义方法以使用ref hook-React Native Function Components

  14. 14

    在React Native外部组件中调用函数

  15. 15

    React Native:从类中调用功能组件内部的函数

  16. 16

    React Native中的条件渲染

  17. 17

    在React Native中渲染特定组件

  18. 18

    如何使用Axios React Native在FlatList中渲染共振?

  19. 19

    如何在React Native中不使用任何API调用的情况下重新渲染组件?

  20. 20

    从其子级触发React父级功能组件中的函数

  21. 21

    React中的Map函数

  22. 22

    在React的子组件中调用父函数

  23. 23

    React Native FlatList - 在返回组件的渲染方法中调用函数

  24. 24

    React Native - 在子事件处理程序更新父状态后,子中的 .Map() 项目不会重新呈现

  25. 25

    React Native 在渲染方法中调用函数

  26. 26

    如何在 React Native 中使用函数渲染组件

  27. 27

    在 React 中使用 map() 生成的组件中隐藏子组件

  28. 28

    如何在 React Native 打字稿中从父级调用子组件方法

  29. 29

    使用 .map react native 映射发送的道具

热门标签

归档