gpt4 book ai didi

javascript - ReactJs 尝试在 Ajax 加载元素之前附加 onclick 处理程序

转载 作者:行者123 更新时间:2023-12-02 16:04:01 25 4
gpt4 key购买 nike

我正在 ReactJs 中为菜单创建动态列表。每个菜单项的数据都是通过 AJAX 从 JSON 文件中提取的。我希望单击菜单项时关闭菜单。当单击其中一个菜单项时,我为整个列表提供“whenClicked”属性。下面是代码:

var MenuList = React.createClass({
getInitialState: function() {
return {data: []}
},
componentWillMount: function() {
$.ajax({
url: 'http://10.0.0.97:8888/public-code/data/data.json',
dataType: 'json',
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, error) {
var err = JSON.parse(xhr.responseText);
console.log(err.Message);
}
});
},
render: function() {
var list = this.state.data.map(function(menuItemProps) {
return <MenuItem onClick={this.props.whenClicked} {...menuItemProps} key={menuItemProps.id} />
});
return (
<ul id="menu-list">
{list}
</ul>
)
}
});

“whenClicked”属性随后会触发父菜单中名为“handleClick”的函数,该函数会更改菜单的状态并在菜单打开时将其关闭。以下是包含上面 MenuList 组件的父菜单组件的代码:

module.exports = React.createClass({

getInitialState: function() {
return {open: false, mobi: false}
},
handleClick: function() {
this.setState({open: !this.state.open})
},
closeOnMobiScroll: function() {
/*
if(this.state.mobi === false) {
this.setState({open: false})
}
*/
},
updateDimensions: function() {
$(window).width() >= 767 ? this.setState({mobi: true}) : this.setState({mobi: false});
},
componentWillMount: function() {
this.updateDimensions();
},
componentDidMount: function() {
$(window).on("resize", this.updateDimensions);
},
componentWillUnmount: function() {
$(window).on("resize", this.updateDimensions);
},
render: function() {
return (

<div id="menu" className={(this.state.open ? 'open' : '')} >
<div id="menu-inner-wrap">
<MenuTitle />
<MenuToggle whenClicked={this.handleClick}/>
<MenuList whenClicked={this.handleClick}/>
</div>
</div>

)
}

});

问题是整个脚本在 AJAX 调用触发之前中断,并且出现以下错误:

Uncaught TypeError: Cannot read property 'whenClicked' of undefined

由于我在控制台中没有看到 AJAX“失败”消息,我怀疑问题在于 React 正在尝试连接

onClick={this.props.whenClicked}

在我的数据加载之前。

有办法解决这个问题吗?我还缺少其他东西吗?

最佳答案

该问题与 Ajax 调用或 React 无关。

在传递给 .map 的回调中,this 指的是全局对象不是组件。全局对象没有 prop 属性,因此会出现错误。

您可以使用.bind将函数的this值绑定(bind)到组件:

this.state.data.map(function(...) { ... }.bind(this));

更多信息:How to access the correct `this` context inside a callback?

关于javascript - ReactJs 尝试在 Ajax 加载元素之前附加 onclick 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30932389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com