我已经编写了这段代码,目前正在处理onClick事件中的错误。我有两个事件,子元素上的onClick事件和顶级父元素上的onChange事件。
预期的行为应该是更改当前在Container组件中保存的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}
在父容器组件内的每个子项和嵌套子项上。因此,所有道具都应向下传播到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功能,你应该通过在this对thisArg调用时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具有诸如accounts和的冗余变量activeAccount。我认为您应该考虑仅转移onChange功能:
AccountRow
accounts
activeAccount
onChange
<AccountRow account = {each_account.name} key = {each_account.name} onChange = {this.props.onChange} />