Javascript 如何在React中实现高阶组件?

Javascript 如何在React中实现高阶组件?,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我试图在React中设置一个HOC,以便能够对任何输入组件应用文本选择检测。然而,当我试图把它组合起来时,我似乎遗漏了一些东西 我在这里关注这篇关于如何创建HOC的文章: 我的代码(在文章看起来像这样之前): 从“道具类型”导入{func}; 从“React”导入React,{PureComponent}; 从“reactstrap”导入{Input}; 类SelectableInput扩展了PureComponent{ handleMouseUp=()=>{ const selection=

我试图在React中设置一个HOC,以便能够对任何输入组件应用文本选择检测。然而,当我试图把它组合起来时,我似乎遗漏了一些东西

我在这里关注这篇关于如何创建HOC的文章:

我的代码(在文章看起来像这样之前):

从“道具类型”导入{func};
从“React”导入React,{PureComponent};
从“reactstrap”导入{Input};
类SelectableInput扩展了PureComponent{
handleMouseUp=()=>{
const selection=window.getSelection();
如果(选择){
this.props.onSelectionChanged(selection.toString());
}
};
render(){
//eslint禁用下一行
const{onSelectionChanged,…rest}=this.props;
返回;
}
}
SelectableInput.propTypes={
onSelectionChanged:func
};
导出默认可选择输入;
我是这样使用它的:

import { func } from 'prop-types';
import React, { PureComponent } from 'react';
import { Input } from 'reactstrap';

class SelectableInput extends PureComponent {
    handleMouseUp = () => {
        const selection = window.getSelection();

        if (selection) {
            this.props.onSelectionChanged(selection.toString());
        }
    };

    render() {
        // eslint-disable-next-line
        const { onSelectionChanged, ...rest } = this.props;
        return <Input onMouseUp={this.handleMouseUp} {...rest} />;
    }
}

SelectableInput.propTypes = {
    onSelectionChanged: func
};

export default SelectableInput;

    render() {
        return (
                <SelectableInput
                    type="textarea"
                    name="textarea-input"
                    value={'This is some txt'}
                    onSelectionChanged={onTextSelectionChanged}
                    id="textarea-input"
                    onChange={e => this.onPageDataChanged(e)}
                    dir="rtl"
                    rows="14"
                    placeholder="Placeholder..."
                />
        );
    }
const ResultComponent = ({...props}) =>
    SelectableInput({...props})(YourParamComponent);
render(){
返回(
this.onPageDataChanged(e)}
dir=“rtl”
rows=“14”
占位符=“占位符…”
/>
);
}
阅读文章后,我将上述代码更改为:

const SelectableInput = WrappedInput => {
    class SelectableInputHOC extends PureComponent {
        handleMouseUp = () => {
            const selection = window.getSelection();

            if (selection) {
                this.props.onSelectionChanged(selection.toString());
            }
        };

        render() {
            // eslint-disable-next-line
            const { onSelectionChanged, ...rest } = this.props;
            return <WrappedInput onMouseUp={this.handleMouseUp} {...rest} />;
        }
    }

    SelectableInputHOC.propTypes = {
        onSelectionChanged: func
    };
};

export default SelectableInput;
const SelectableInput=WrappedInput=>{
类SelectableInputHOC扩展了PureComponent{
handleMouseUp=()=>{
const selection=window.getSelection();
如果(选择){
this.props.onSelectionChanged(selection.toString());
}
};
render(){
//eslint禁用下一行
const{onSelectionChanged,…rest}=this.props;
返回;
}
}
SelectableInputHOC.propTypes={
onSelectionChanged:func
};
};
导出默认可选择输入;
我的问题是,现在如何在render()函数中实际使用它


感谢您的帮助。

SelectableInput是一个函数,它返回一个函数,该函数将一个组件作为参数,并返回另一个组件。您可以这样使用它:

import { func } from 'prop-types';
import React, { PureComponent } from 'react';
import { Input } from 'reactstrap';

class SelectableInput extends PureComponent {
    handleMouseUp = () => {
        const selection = window.getSelection();

        if (selection) {
            this.props.onSelectionChanged(selection.toString());
        }
    };

    render() {
        // eslint-disable-next-line
        const { onSelectionChanged, ...rest } = this.props;
        return <Input onMouseUp={this.handleMouseUp} {...rest} />;
    }
}

SelectableInput.propTypes = {
    onSelectionChanged: func
};

export default SelectableInput;

    render() {
        return (
                <SelectableInput
                    type="textarea"
                    name="textarea-input"
                    value={'This is some txt'}
                    onSelectionChanged={onTextSelectionChanged}
                    id="textarea-input"
                    onChange={e => this.onPageDataChanged(e)}
                    dir="rtl"
                    rows="14"
                    placeholder="Placeholder..."
                />
        );
    }
const ResultComponent = ({...props}) =>
    SelectableInput({...props})(YourParamComponent);
然后在任何需要的地方呈现ResultComponent

这里有一个使用HOC并向其传递道具的示例:

HTML:


JS

constYourParamComponent=({name})=>name:{name}
const SelectableInput=({…props})=>
WrappedInput=>
const ResultComponent=({…props})=>
SelectableInput({…props})(YourParamComponent);
常量应用=()=>
ReactDOM.render(
,
document.getElementById('root'))
)

SelectableInput是一个函数,它返回一个函数,该函数将一个组件作为参数,并返回另一个组件。您可以这样使用它:

import { func } from 'prop-types';
import React, { PureComponent } from 'react';
import { Input } from 'reactstrap';

class SelectableInput extends PureComponent {
    handleMouseUp = () => {
        const selection = window.getSelection();

        if (selection) {
            this.props.onSelectionChanged(selection.toString());
        }
    };

    render() {
        // eslint-disable-next-line
        const { onSelectionChanged, ...rest } = this.props;
        return <Input onMouseUp={this.handleMouseUp} {...rest} />;
    }
}

SelectableInput.propTypes = {
    onSelectionChanged: func
};

export default SelectableInput;

    render() {
        return (
                <SelectableInput
                    type="textarea"
                    name="textarea-input"
                    value={'This is some txt'}
                    onSelectionChanged={onTextSelectionChanged}
                    id="textarea-input"
                    onChange={e => this.onPageDataChanged(e)}
                    dir="rtl"
                    rows="14"
                    placeholder="Placeholder..."
                />
        );
    }
const ResultComponent = ({...props}) =>
    SelectableInput({...props})(YourParamComponent);
然后在任何需要的地方呈现ResultComponent

这里有一个使用HOC并向其传递道具的示例:

HTML:


JS

constYourParamComponent=({name})=>name:{name}
const SelectableInput=({…props})=>
WrappedInput=>
const ResultComponent=({…props})=>
SelectableInput({…props})(YourParamComponent);
常量应用=()=>
ReactDOM.render(
,
document.getElementById('root'))
)

您选择不遵循官方(非常)优秀的指南有什么原因吗?您选择不遵循官方(相当)优秀的指南有什么原因吗?谢谢你的回复!你能给我一个小片段,我将如何使用它的道具?例如:```type=“textarea”name=“textarea input”```我如何使用这些道具声明YourParamComponent?你能给我看看render()函数中的一个片段吗?当然,我刚刚添加了一个示例和他的JSFIDLE。希望有帮助!你能帮我投票吗?(是向上箭头)谢谢。声誉低于15的人所投的票会被记录下来,但不会改变公开显示的帖子分数。(我是新来的)谢谢你的回复!你能给我一个小片段,我将如何使用它的道具?例如:```type=“textarea”name=“textarea input”```我如何使用这些道具声明YourParamComponent?你能给我看看render()函数中的一个片段吗?当然,我刚刚添加了一个示例和他的JSFIDLE。希望有帮助!你能帮我投票吗?(是向上箭头)谢谢。声誉低于15的人所投的票会被记录下来,但不会改变公开显示的帖子分数。(我是新来的)