我几乎是新来的react。我正在尝试创建一个简单的编辑和创建蒙版。这是代码:
react
import React, { Component } from 'react'; import Company from './Company'; class CompanyList extends Component { constructor(props) { super(props); this.state = { search: '', companies: props.companies }; } updateSearch(event) { this.setState({ search: event.target.value.substr(0,20) }) } addCompany(event) { event.preventDefault(); let nummer = this.refs.nummer.value; let bezeichnung = this.refs.bezeichnung.value; let id = Math.floor((Math.random()*100) + 1); $.ajax({ type: "POST", context:this, dataType: "json", async: true, url: "../data/post/json/companies", data: ({ _token : window.Laravel.csrfToken, nummer: nummer, bezeichnung : bezeichnung, }), success: function (data) { id = data.Nummer; this.setState({ companies: this.state.companies.concat({id, nummer, bezeichnung}) }) this.refs.bezeichnung.value = ''; this.refs.nummer.value = ''; } }); } editCompany(event) { alert('clicked'); event.preventDefault(); this.refs.bezeichnung.value = company.Bezeichnung; this.refs.nummer.value = company.Nummer; } render() { let filteredCompanies = this.state.companies.filter( (company) => { return company.bezeichnung.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1; } ); return ( <div> <div className="row"> <div className="col-xs-12 col-sm-12 col-md-12 col-lg-12">Suche</div> <div className="col-xs-12 col-sm-12 col-md-9 col-lg-9"> <div className="form-group"> <input className="form-control" type="text" value={this.state.search} placeholder="Search" onChange={this.updateSearch.bind(this)} /> </div> </div> </div> <form onSubmit={this.addCompany.bind(this)}> <div className="row"> <div className="col-xs-12 col-sm-12 col-md-12 col-lg-12">Neuen Eintrag erfassen</div> <div className="col-xs-12 col-sm-12 col-md-3 col-lg-3"> <div className="form-group"> <input className="form-control" type="text" ref="nummer" placeholder="Nummer" required /> </div> </div> <div className="col-xs-12 col-sm-12 col-md-3 col-lg-3"> <div className="form-group"> <input className="form-control" type="text" ref="bezeichnung" placeholder="Firmenname" required /> </div> </div> <div className="col-xs-12 col-sm-12 col-md-3 col-lg-3"> <div className="form-group"> <button type="submit" className="btn btn-default">Add new company</button> </div> </div> </div> </form> <div className="row"> <div className="col-xs-10 col-sm-10 col-md-10 col-lg-10"> <ul> { filteredCompanies.map((company)=> { return <Company company={company} key={company.id} onClick={this.editCompany.bind(this)} /> }) } </ul> </div> </div> </div> ); } } export default CompanyList
Company类如下所示:
import React, { Component } from 'react'; const Company = ({company}) => <li> {company.Nummer} {company.Bezeichnung} </li> export default Company
现在我的问题是,onclick当我单击时,为什么不触发该事件Company。
onclick
Company
在这一部分:
<ul> { filteredCompanies.map((company)=> { return <Company company={company} key={company.id} onClick={this.editCompany.bind(this)} className="Company"/> }) } </ul>
原因很简单,当您点击
<Company company={company} key={company.id} onClick={this.editCompany.bind(this)} />
它不是在组件上设置的事件,而是传递给Company组件并可以像props.company在Company组件中一样访问的prop ,
props.company
您需要做的是指定onClick事件,并className在Company组件中指定
onClick
className
import React, { Component } from 'react'; const Company = ({company, onClick, className}) => ( <li onClick={onClick} className={className}> {company.Nummer} {company.Bezeichnung} </li> ) export default Company
作为prop传递给Company组件的函数可以通过任何名称传递,例如
<Company company={company} key={company.id} editCompany={this.editCompany.bind(this)} className="Company"/>
并像
import React, { Component } from 'react'; const Company = ({company, editCompany}) => ( <li onClick={editCompany}> {company.Nummer} {company.Bezeichnung} </li> )