如何将装饰语法转换为ES6?
我想了解some code反应写在ESnext(装饰)。 我知道如何装饰从ESnext转换器ES6语法如何将装饰语法转换为ES6?
// ESnext
function collect(connect, monitor) {
return {
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging()
}
}
@DragSource(Types.CARD, cardSource, collect)
export default class Card extends React.Component {
render() {
const { id } = this.props;
const { isDragging, connectDragSource } = this.props;
return connectDragSource(
<div>
I am a draggable card number {id}
{isDragging && ' (and I am being dragged now)'}
</div>
);
}
}
ES6
// ES6
function collect(connect, monitor) {
return {
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging()
};
}
class Card extends React.Component {
render() {
const { id } = this.props;
const { isDragging, connectDragSource } = this.props;
return connectDragSource(
<div>
I am a draggable card number {id}
{isDragging && ' (and I am being dragged now)'}
</div>
);
}
}
export default DragSource(Types.CARD, cardSource, collect)(Card);
但我坚持如何将此代码转换为ES6?
function collectDrop(connect) {
return {
connectDropTarget: connect.dropTarget(),
};
}
function collectDrag(connect, monitor) {
return {
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging()
};
}
@DropTarget(ItemTypes.CARD, cardTarget, collectDrop)
@DragSource(ItemTypes.CARD, cardSource, collectDrag)
export default class Card extends Component {
static propTypes = {
connectDragSource: PropTypes.func.isRequired,
connectDropTarget: PropTypes.func.isRequired,
index: PropTypes.number.isRequired,
isDragging: PropTypes.bool.isRequired,
id: PropTypes.any.isRequired,
text: PropTypes.string.isRequired,
moveCard: PropTypes.func.isRequired,
};
render() {
const { text, isDragging, connectDragSource, connectDropTarget } = this.props;
const opacity = isDragging ? 0 : 1;
return connectDragSource(connectDropTarget(
<div style={{ ...style, opacity }}>
{text}
</div>,
));
}
}
因为你有两个高阶组件(HOC)装饰你需要把它们混合起来,敷类与这两个(DropTarget的和DragSource上)导出时。如果您使用的是redux
库,那么您可以使用它的效用函数compose
,该函数结合了多个HOC并将其封装在类中。你需要关注的代码是在下面的代码的末尾:
import { compose } from 'redux'
function collectDrop(connect) {
return {
connectDropTarget: connect.dropTarget(),
};
}
function collectDrag(connect, monitor) {
return {
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging()
};
}
class Card extends Component {
static propTypes = {
connectDragSource: PropTypes.func.isRequired,
connectDropTarget: PropTypes.func.isRequired,
index: PropTypes.number.isRequired,
isDragging: PropTypes.bool.isRequired,
id: PropTypes.any.isRequired,
text: PropTypes.string.isRequired,
moveCard: PropTypes.func.isRequired,
};
render() {
const { text, isDragging, connectDragSource, connectDropTarget } = this.props;
const opacity = isDragging ? 0 : 1;
return connectDragSource(connectDropTarget(
<div style={{ ...style, opacity }}>
{text}
</div>,
));
}
}
const enhance = compose(
DropTarget(ItemTypes.CARD, cardTarget, collectDrop),
DragSource(ItemTypes.CARD, cardSource, collectDrag)
)
export default enhance(Card)
或者(如果您使用的不是终极版),你可以像它们组合起来:
// Comment this part out
/* const enhance = compose(
DropTarget(ItemTypes.CARD, cardTarget, collectDrop),
DragSource(ItemTypes.CARD, cardSource, collectDrag)
)
export default enhance(Card)*/
// and change to this
const dropTargetHOC = DropTarget(ItemTypes.CARD, cardTarget, collectDrop)
const dragSourceHOC = DragSource(ItemTypes.CARD, cardSource, collectDrag)
export default dropTargetHOC(dragSourceHOC(Card))
打字稿文档提供的decorator composition很好的解释(TS装饰和ES decorators proposal是在大多数情况下是相同的):
当多个装饰应用到单个声明,他们的 evaluati与数学中的函数组成类似。在这个 模型中,当组合函数f和g时,得到的复合体(f∘ g)(x)等价于f(g(x))。
每个装饰的表达式进行求值顶部至底部:
这样,在打字原稿在单个声明评估多个 装饰时,执行以下步骤。
然后结果被称为从下到上的函数。
所以这应该是:
export default DropTarget(ItemTypes.CARD, cardTarget, collectDrop)(
DragSource(ItemTypes.CARD, cardSource, collectDrag)(Card);
);
这应该在生产用于大专院校的目的,而不是。原始代码不是ES6,而是JSX,它仍然需要将转换器(Babel)转换为有效的JavaScript。所以没有理由不使用Babel提供的所有功能,包括修饰器。
谢谢! ,解释是我需要的! –
您发布的内容不是ES7。 ES7(ES2016)不支持修饰器。 –
@FelixKling感谢您的澄清! –