如何从渲染中的点击事件调用方法?
How to call a method from click event within render?
我正在使用状态在图标的单击事件中打开和关闭图层。当我从点击处理程序调用 _onOpenLayer()
时,没有任何反应。
以前我直接从图标调用方法单击 onClick={this._onOpenLayer()}
,这确实打开了层,但如果由于不允许在 rednder() 中调用方法而冻结 UI .
所以我在调用打开之前找到了 的解决方案,如下所示。但是单击图标不会打开具有此更改的图层:
onClick={() => this._onOpenLayer()}
为了进一步调试它,我在 _onOpenLayer()
方法中放置了一个 console.log,我可以看到它没有点击图标。
问题:
如何从 render 方法中的点击事件调用方法?
这是我正在呈现的 class 的要点。 _onOpenLayer() 将 openLayer 状态设置为 true,从而打开图层元素:
class Page1 extends Component {
constructor(props) {
super(props);
this.state = {
openLayer: false,
};
}
_onOpenLayer() {
console.log("fooo");
this.setState({
openLayer: true
});
}
_onCloseLayer() {
this.setState({
openLayer: false
});
}
render() {
let layerNode;
if (this.state.openLayer) {
layerNode = (
<Layer flush={true} closer={true} onClose={() => this._onCloseLayer()} align='right'>
</Layer>
);
}
return (
<Section pad="small" full="vertical" flex={true}>
<div>
<Box direction="row" align="center" justify="end" tag="aside" pad={{horizontal: "large" , between: "small"}} >
<Filter size="medium" colorIndex="brand" onClick={() => this._onOpenLayer()} />
</Box>
{layerNode}
</Section>
);
}
};
确保图标可点击(检查css中的pointer-events
)并确保触发onClick
。
否则试试这个....
class Page1 extends Component {
constructor(props) {
super(props);
this.state = {
openLayer: false,
};
this._onOpenLayer = this._onOpenLayer.bind(this)
this._onCloseLayer = this._onCloseLayer.bind(this)
}
_onOpenLayer() {
console.log("fooo");
this.setState({
openLayer: true
});
}
_onCloseLayer() {
this.setState({
openLayer: false
});
}
render() {
let layerNode;
if (this.state.openLayer) {
layerNode = (
<Layer flush={true} closer={true} onClose={this._onCloseLayer} align='right'>
</Layer>
);
}
return (
<Section pad="small" full="vertical" flex={true}>
<div>
<Box direction="row" align="center" justify="end" tag="aside" pad={{horizontal: "large" , between: "small"}} >
<Filter size="medium" colorIndex="brand" onClick={this._onOpenLayer} />
</Box>
{layerNode}
</Section>
);
}
};
lambda被es2015/es6使用,你需要使用polyfill或者babel...
class Page1 extends Component {
constructor(props) {
super(props);
this.state = {
openLayer: false,
};
}
_onOpenLayer() {
console.log("fooo");
this.setState({
openLayer: true
});
}
_onCloseLayer() {
this.setState({
openLayer: false
});
}
render() {
let layerNode;
if (this.state.openLayer) {
layerNode = (
<Layer flush={true} closer={true} onClose={this._onCloseLayer} align='right'>
</Layer>
);
}
return (
<Section pad="small" full="vertical" flex={true}>
<div>
<Box direction="row" align="center" justify="end" tag="aside" pad={{horizontal: "large" , between: "small"}} >
<Filter size="medium" colorIndex="brand" onClick={this._onOpenLayer} />
</Box>
{layerNode}
</Section>
);
}
};
我假设您想 调用 _onOpenLayer()
方法,而不是在 render() 中,而是在每次单击图标时调用。
所以不要在渲染中调用该方法:
onClick={this._onOpenLayer()}
你可以将你的函数传递给 onClick
prop
onClick={this._onOpenLayer.bind(this)}
我正在使用状态在图标的单击事件中打开和关闭图层。当我从点击处理程序调用 _onOpenLayer()
时,没有任何反应。
以前我直接从图标调用方法单击 onClick={this._onOpenLayer()}
,这确实打开了层,但如果由于不允许在 rednder() 中调用方法而冻结 UI .
所以我在调用打开之前找到了
onClick={() => this._onOpenLayer()}
为了进一步调试它,我在 _onOpenLayer()
方法中放置了一个 console.log,我可以看到它没有点击图标。
问题:
如何从 render 方法中的点击事件调用方法?
这是我正在呈现的 class 的要点。 _onOpenLayer() 将 openLayer 状态设置为 true,从而打开图层元素:
class Page1 extends Component {
constructor(props) {
super(props);
this.state = {
openLayer: false,
};
}
_onOpenLayer() {
console.log("fooo");
this.setState({
openLayer: true
});
}
_onCloseLayer() {
this.setState({
openLayer: false
});
}
render() {
let layerNode;
if (this.state.openLayer) {
layerNode = (
<Layer flush={true} closer={true} onClose={() => this._onCloseLayer()} align='right'>
</Layer>
);
}
return (
<Section pad="small" full="vertical" flex={true}>
<div>
<Box direction="row" align="center" justify="end" tag="aside" pad={{horizontal: "large" , between: "small"}} >
<Filter size="medium" colorIndex="brand" onClick={() => this._onOpenLayer()} />
</Box>
{layerNode}
</Section>
);
}
};
确保图标可点击(检查css中的pointer-events
)并确保触发onClick
。
否则试试这个....
class Page1 extends Component {
constructor(props) {
super(props);
this.state = {
openLayer: false,
};
this._onOpenLayer = this._onOpenLayer.bind(this)
this._onCloseLayer = this._onCloseLayer.bind(this)
}
_onOpenLayer() {
console.log("fooo");
this.setState({
openLayer: true
});
}
_onCloseLayer() {
this.setState({
openLayer: false
});
}
render() {
let layerNode;
if (this.state.openLayer) {
layerNode = (
<Layer flush={true} closer={true} onClose={this._onCloseLayer} align='right'>
</Layer>
);
}
return (
<Section pad="small" full="vertical" flex={true}>
<div>
<Box direction="row" align="center" justify="end" tag="aside" pad={{horizontal: "large" , between: "small"}} >
<Filter size="medium" colorIndex="brand" onClick={this._onOpenLayer} />
</Box>
{layerNode}
</Section>
);
}
};
lambda被es2015/es6使用,你需要使用polyfill或者babel...
class Page1 extends Component {
constructor(props) {
super(props);
this.state = {
openLayer: false,
};
}
_onOpenLayer() {
console.log("fooo");
this.setState({
openLayer: true
});
}
_onCloseLayer() {
this.setState({
openLayer: false
});
}
render() {
let layerNode;
if (this.state.openLayer) {
layerNode = (
<Layer flush={true} closer={true} onClose={this._onCloseLayer} align='right'>
</Layer>
);
}
return (
<Section pad="small" full="vertical" flex={true}>
<div>
<Box direction="row" align="center" justify="end" tag="aside" pad={{horizontal: "large" , between: "small"}} >
<Filter size="medium" colorIndex="brand" onClick={this._onOpenLayer} />
</Box>
{layerNode}
</Section>
);
}
};
我假设您想 调用 _onOpenLayer()
方法,而不是在 render() 中,而是在每次单击图标时调用。
所以不要在渲染中调用该方法:
onClick={this._onOpenLayer()}
你可以将你的函数传递给 onClick
prop
onClick={this._onOpenLayer.bind(this)}