gpt4 book ai didi

ReactJS:子组件调用父组件时 "this.props"不是函数

转载 作者:行者123 更新时间:2023-12-03 13:15:53 25 4
gpt4 key购买 nike

我已经编写了这段代码,目前正在解决 onClick 事件中的错误。我有两个事件,子元素上的 onClick 事件和顶级父元素上的 onChange 事件。

预期的行为应该是更改容器组件中当前保存的 activeAccount 变量。为此,我在 AccountRow 组件上添加了一个 onClick 处理程序,该处理程序随后应调用顶级父级的 onChange 函数。

但是,这条线

'this.props.onChange(this.props.account)',

handleClick: function(e) {
this.props.onChange(this.props.account);
},

意味着使用参数“this.props.account”调用父函数,

给我这个错误:

Uncaught TypeError: this.props.onChange is not a function.

我最初认为这是一个范围问题,但我添加了

{...this.props}

父容器中的每个子容器和嵌套子容器成分。因此,所有 props 都应该被传播到 AccountRow 组件。尽管如此,问题仍然存在。

    var ACCOUNTS = [
{name: 'cash on hand'},
{name: 'savings account'},
{name: 'shared account'},
{name: 'my second wallet'}
];

var TRANSACTIONS = [
{date: '', name: 'Bananas', amount: 6, category: 'Groceries', account: 'cash on hand'},
{date: '', name: 'Apples', amount: 2.50, category: 'Groceries', account: 'cash on hand'},
{date: '', name: 'Cash withdrawal', amount: 250, account: 'savings account'}
];

var AccountRow = React.createClass({

handleClick: function(e) {
this.props.onChange(this.props.account);
},

render: function () {
return (
<li onClick = {this.handleClick}> {this.props.account}</li>
)}
});

var AccountList = React.createClass({

render: function () {

var rows = [];
this.props.accounts.map(function(each_account) {
rows.push(
<AccountRow
account = {each_account.name}
key = {each_account.name}
{...this.props}
/>);
})
return (
<ul>
{rows}
</ul>
)
}
});


var NavBar = React.createClass({

render: function () {
return (
<div id = 'account-tabs'>
<h2> Accounts </h2>
<AccountList
accounts = {this.props.accounts}
{...this.props}
/>
</div>
)
}
});

var TransactionRow = React.createClass({
render: function (){
var trans = this.props.transaction;

return (
<tr>
<td>{trans.date}</td>
<td>{trans.name}</td>
<td>{trans.amount}</td>
<td>{trans.account}</td>
<td><a href = ''>edit</a></td>
</tr>
)
}
});

var TransactionList = React.createClass ({
render: function () {

var activeaccount = this.props.activeAccount;

var rows = [];
this.props.transactions.map(function(each_transaction) {
if (each_transaction.account == activeaccount) {

/* Very strange behaviour
if (each_transaction account == this.props.activeAccount)
DOES NOT WORK, I do not know why this is the case
*/

rows.push(<TransactionRow transaction = {each_transaction} key = {each_transaction.name} />);
}
else {
/*console.log(each_transaction.account);*/
}
})
return (
<tbody>
{rows}
</tbody>
)
}
});

var TransactionsTable = React.createClass({
render: function() {

return (
<div id = 'recent-transactions'>
<h2>Recent Transactions for {this.props.activeAccount}</h2>
<table>
<tr>
<th>date</th>
<th>name</th>
<th>amount</th>
<th>account</th>
<th>edit </th>
</tr>
<TransactionList
transactions = {this.props.transactions}
activeAccount = {this.props.activeAccount}
/>
</table>
</div>
)
}
});

var TransactionForm = React.createClass({
render: function() {
return (
<div>
<h2>Add Transaction </h2>
<p>Transaction name</p>
<input type = 'text' />
<p>Price</p>
<input type = 'number'/>
<p>Category (optional) </p>
<input type = 'text' />
</div>
)
}
});


var ButtonMenu = React.createClass ({
render: function () {
return (
<div>
<button>Add Transaction</button>
</div>
)
}
});

var Container = React.createClass({

getInitialState: function (){
return {
activeAccount: ACCOUNTS[0].name
};
},

setActiveAccount: function(dat) {
this.setState({
activeAccount: dat
});
},

render: function () {
return (
<div id = 'wrapper'>
<NavBar
accounts = {ACCOUNTS}
activeAccount = {this.state.activeAccount}
onChange = {this.setActiveAccount}
{...this.props}
/>
<TransactionsTable
transactions = {TRANSACTIONS}
activeAccount = {this.state.activeAccount}
/>
<TransactionForm />
<ButtonMenu />
</div>
);
}
});


React.render(<Container />, document.body);

感谢您的宝贵时间。

最佳答案

该问题是由map函数引起的,调用map时应将this传入thisArg:

this.props.accounts.map(function(each_account) {
rows.push(
<AccountRow
account = {each_account.name}
key = {each_account.name}
{...this.props}
/>);
}, this);

但是,这将导致 AccountRow 具有冗余变量,例如 accountsactiveAccount。我认为你应该考虑只转移 onChange 函数:

 <AccountRow 
account = {each_account.name}
key = {each_account.name}
onChange = {this.props.onChange}
/>

关于ReactJS:子组件调用父组件时 "this.props"不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29983880/

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