简体   繁体   English

将prop值传递给另一个组件时如何避免箭头函数?

[英]How to avoid arrow function while passing prop values to another component?

**ApplicatorType Stateful Component**    

class ApplicatorType extends Component {

public state = {
applicatorTypes: ['Carpenter', 'Painter', 'Plumber'],
applicatorTypesSelected: [],
}

public render() {

allotedTypes = (
    <DisplayTypes
        applicatorTypes={this.state.applicatorTypes}
        changed={this.typeCheckedHandler}
        checkedType={this.state.applicatorTypesSelected}
    />
);

return <div> {allotedTypes} </div>
}

private typeCheckedHandler = 
(event: React.ChangeEvent, selected: string) => {

    const index = this.state.applicatorTypesSelected.indexOf(selected);
    if (index < 0) {
        this.state.applicatorTypesSelected.push(selected);
    } else {
        this.state.applicatorTypesSelected.splice(index, 1);
    }
    this.setState({
        applicatorTypesSelected:[...this.state.applicatorTypesSelected]
    });
};
}


**DisplayTypes Stateless Component**

import * as React from 'react';
import Checkbox from '../../UI/Checkbox/Checkbox';

const displayTypes: React.SFC<any> = 
({applicatorTypes, changed, checkedType}) => 

   applicatorTypes.map((element: string, index: number) => {
       return 
       (<Checkbox
        key={index}
        changed={(event: React.ChangeEvent) => changed(event, element)}
        checkedType={checkedType.some((x: string) => x === element)}
        element={element}
        />);
     })

 export default displayTypes;


 **Checkbox stateless component**


 const checkbox: React.SFC<any> = ({ element, changed, checkedType}) => 
 {
   return (
      <div>
        <input
            name={element}
            className="checkbox"
            type="checkbox"
            onChange={changed}
            checked={checkedType}
        />{' '}
        &nbsp;
        <label onClick={changed}>{element}</label>
    </div>
    );
   };

   export default checkbox;

In the above DisplayTypes Component, here,在上面的 DisplayTypes 组件中,这里,

 changed={(event: React.ChangeEvent) => changed(event, element)}
 checkedType={checkedType.some((x: string) => x === element)}

the recommended way is to avoid arrow functions.推荐的方法是避免箭头函数。 However, I could not make it work without arrow functions.但是,如果没有箭头函数,我无法让它工作。 Is there a better way to achieve the same functionality without arrow functions?有没有更好的方法可以在没有箭头函数的情况下实现相同的功能?

Right now, I am using "jsx-no-lambda": false in tslint.json and the code is working perfectly fine.现在,我在 tslint.json 中使用 "jsx-no-lambda": false 并且代码运行良好。

You can make the following changes to avoid lambda functions您可以进行以下更改以避免使用 lambda 函数

private typeCheckedHandler = 
    (selected: string, event: React.ChangeEvent,) => {
        ...
        ...
    };

And change the component as:并将组件更改为:

const DisplayTypes =
  ({ applicatorTypes, changed, checkedType }) => {
      return applicatorTypes.map((element, index) => {
        let list = checkedType.some((x: string) => x === element);
        return (<Checkbox
          key={index}
          changed={changed.bind({}, element)}
          checkedType={list}
          element={element}
        />);
      })
}

Feel free to post comment in case of need.如有需要,请随时发表评论。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM