【问题标题】:Applying className/onClick/onChange not working on Custom React Component应用 className/onClick/onChange 不适用于自定义 React 组件
【发布时间】:2017-10-19 14:10:34
【问题描述】:

我几乎是 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

我现在的问题是,当我点击Company 时,为什么没有触发onclick 事件。

在这部分:

      <ul>
      { 
        filteredCompanies.map((company)=> {
          return <Company company={company} key={company.id} onClick={this.editCompany.bind(this)} className="Company"/>
        })
      }
      </ul>

【问题讨论】:

    标签: javascript reactjs events jsx


    【解决方案1】:

    原因很简单,当你点赞时

    <Company company={company} key={company.id} onClick={this.editCompany.bind(this)} />
    

    它不是在组件上设置的事件,而是传递给 Company 组件的道具,可以像 Company 组件中的 props.company 一样访问,

    您需要做的是在 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>
    )
    

    【讨论】:

    • 感谢您的回答。但是我是否还需要在Company 中指定事件本身,或者我也可以在CompanyList 中指定它以使用控件进行输入?我的意思是方法editCompany
    • 事件将在组件级别指定,因此在Company组件本身中,您需要调用该事件的函数可以以任何名称传递
    • 只是添加一点点解释——我相信 React 中的默认 HTML 元素像普通 HTML 元素一样具有 onClick 属性,但是由于您正在定义自定义反应组件,因此 onClick 被视为自定义属性,而不是内置的 onclick 属性
    【解决方案2】:

    你必须在你的子组件上绑定事件:

    import React, { Component } from 'react';
    
    const Company = ({ company, onClick }) => 
       <li onClick={onClick}>
          {company.Nummer} {company.Bezeichnung}
       </li>
    
    
    export default Company
    

    const Company = ({ company, ...props }) => 
       <li {...props}>
          {company.Nummer} {company.Bezeichnung}
       </li>
    

    如果您希望传递给您的 Compagny 组件(除了 compagny)的所有道具都转到您的 li 标签。请参阅 ES6 扩展运算符和休息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2021-03-14
      • 2023-01-01
      • 1970-01-01
      相关资源
      最近更新 更多