Javascript 如何在React中实现高阶组件?
我试图在React中设置一个HOC,以便能够对任何输入组件应用文本选择检测。然而,当我试图把它组合起来时,我似乎遗漏了一些东西 我在这里关注这篇关于如何创建HOC的文章: 我的代码(在文章看起来像这样之前):Javascript 如何在React中实现高阶组件?,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我试图在React中设置一个HOC,以便能够对任何输入组件应用文本选择检测。然而,当我试图把它组合起来时,我似乎遗漏了一些东西 我在这里关注这篇关于如何创建HOC的文章: 我的代码(在文章看起来像这样之前): 从“道具类型”导入{func}; 从“React”导入React,{PureComponent}; 从“reactstrap”导入{Input}; 类SelectableInput扩展了PureComponent{ handleMouseUp=()=>{ const selection=
从“道具类型”导入{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的人所投的票会被记录下来,但不会改变公开显示的帖子分数。(我是新来的)