javascript - 如何正确使用 HOC 和重组

标签 javascript reactjs callback higher-order-functions higher-order-components

我最近才开始使用 React 并阅读了有关 HOC 的内容。

我想做类似的事情:使容器可编辑。 我的“解决方案”(因为它还不能正常工作。)

可编辑行(HOC):

import React from 'react'

import { withStateHandlers, withHandlers, compose } from 'recompose'

const editableRow = () =>
    compose(
        withStateHandlers(
            { isEditing: false, editingId: null },
            {
                toggleEditing: ({ isEditing, editingId }) => entryId => ({
                    isEditing: !isEditing,
                    editingId: isEditing ? null : entryId
                })
            }
        ),
        withHandlers({
            handleSave: ({
                isEditing,
                editingId,
                onEdit,
                onCreate,
                list
            }) => values => {
                console.log('handling...')
                if (isEditing) {
                    const entry = list && list.find(entry => entry.id === editingId)
                    return onEdit(entry.id, values) 
                } else return onCreate(values)
            }
        })
    )

export default editableRow

我的数据行:

import React from 'react'
import { Button, Checkbox, Icon, Table, Input } from 'semantic-ui-react'
import PropTypes from 'prop-types'
import editableRow from 'hoc/editableRow'

const DataRow = props => 
    <Table.Row>
        {
            props.children
        }
    </Table.Row>

export default editableRow()(DataRow)

我的组件将接收我用 HOC 创建的功能和状态, 但出于某种原因我无法传递任何东西(比如调用回调 [onEdit,onCreate])。有没有更好的方法来调用 handleSave 而不是 onSubmit={()=>props.handleSave(props1, props2, ...)}

更新:

我的问题是我无法以任何方式向我的组件发送任何“处理程序”。我这样试过:

<Table.Row onClick={()=>props.handleSave(
        false,
        false,
        props.onCreate,
        props.onEditing,
        props.list
    )}>
        {
            props.children
        }
    </Table.Row>

但是我的 HOC 的 handleSave 只是使用它自己的默认值。我无法联系到他们,所以我无法将任何处理程序传递给它。 我的猜测是我在某处犯了一个非常基本的错误,但不知道在哪里 :D

[就像我救场的时候。这就是为什么我得到那些 onEditing、onCreating 事件,但即使我传递了它们,我的 HOC 也只是使用它自己的默认值而不是我传递给它的参数]

请帮助我,了解这些是如何工作的...:D

最佳答案

import React from 'react'
import {compose} from 'recompose';
import { Button, Checkbox, Icon, Table, Input } from 'semantic-ui-react'
import PropTypes from 'prop-types'
import editableRow from 'hoc/editableRow'

const DataRow = props => {
    const values = {
        isEditing: false,
        editingId: false,
        onEdit: props.onCreate,
        onCreate: props.onEditing,
        list: props.list,
    };

    return (
        <Table.Row onClick={() => {props.handleSave(values)}}>
            {props.children}
        </Table.Row>
    );
}

export default compose(editableRow)(DataRow);

每当您使用HOC组合您的组件时,您的 HOC 将拥有您提供给该组件的 props导出 composed 组件。

因此,在您的 HOC 中,您可以访问像这样传递的 props:

import { withStateHandlers, withHandlers, compose } from 'recompose'

const editableRow = () =>
    compose(
        withStateHandlers(
            { isEditing: false, editingId: null },
            {
                toggleEditing: ({ isEditing, editingId }) => entryId => ({
                    isEditing: !isEditing,
                    editingId: isEditing ? null : entryId
                }),
                handleSave: (state, props) => values => {
                    console.log('handling...')
                    if (isEditing) {
                        const list = values.list;
                        const entry = list && list.find(entry => entry.id === editingId)
                        return props.onEdit(entry.id, values) 
                    } 
                   return props.onCreate(values)
                }
            }
        ),
    )

export default editableRow;

当您使用 withStateHandler 时,您不必显式使用 withHandlers,它可同时用于 state处理程序。我希望这对您有所帮助,如果您仍然遇到困难,请告诉我。

withStateHandler(arg1: an object or a function to set initial state, {
    callback: (state, props) => callbackValues => {
        //call any callback on props
        props.handleSave(); // or props.onCreate() etc.
        //return desired state from here
    }
})

关于javascript - 如何正确使用 HOC 和重组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50152970/

相关文章:

javascript - 无论如何,嵌套的 $http.post 总是返回一个 promise

javascript - 旋转时的 HTML5 Canvas : Calculating a x, y 点

javascript - 未捕获的 TypeError : _moment2. default.date 不是 React 应用程序中的函数

javascript - 映射字符串中的每个单词以重新排序

javascript - 如何在回调中访问正确的 `this`?

javascript - API调用和回调

java - 将回调传递给 Java 中的特定函数

javascript - 为什么子元素不隐藏父元素jquery。?

javascript - 表单提交后的 Angular JS Root 作用域

javascript - 从箭头函数定义变量和返回组件