【问题标题】:Adding event handler添加事件处理程序
【发布时间】:2018-03-12 12:31:00
【问题描述】:

我希望能够在用户单击表单时获得个人。我尝试将事件处理程序添加到代码的返回部分,但我需要在 Person 类中实现类似

onClick={props.click}

的东西。 也有人可以推荐一些对打字稿教程的反应。

import * as React from 'react';
import { RouteComponentProps } from 'react-router';

interface HelloWorldI {
    persons: ReadonlyArray<PersonI>,
    showPersons: boolean
}

interface PersonI {
    name: string,
    age: number,
}

export default class HelloWorld extends React.Component<{}, HelloWorldI> {
    constructor(props:any) {
        super(props)
        const p: ReadonlyArray<PersonI> = [
            { name: 'Max', age: 28},
            { name: 'Max', age: 28 },       
        ]
        this.state = {
            persons: p,
            showPersons: false
        }   
    }

    deletePersonHandler = (personIndex:any) => {
        const persons = this.state.persons;
        persons.slice(personIndex, 1);
        this.setState({ persons: persons });

    }

    togglePersonsHandler = () => {
        const doesShow:any = this.state.showPersons;
        this.setState({ showPersons: !doesShow });
    }

    public render() {
        let persons = null;

        if (this.state.showPersons) {
            persons = (
                <div>
                    {this.state.persons.map((person,index) => {
                        return <Person 
                           onClick={this.deletePersonHandler(index)}
                            name={person.name}
                            age={person.age} />
                    })}
                </div>
            );
        }

        return (
            <div>
                <button onClick={this.togglePersonsHandler}></button>  
                    {persons}
            </div>
        )
    }
}

class Person extends React.Component<{ name: string, age: number }, {}>     {
    render() {
        return (
            <div>
                <p> {this.props.name} and {this.props.age} </p>)
            </div>
        )
    }
}

谢谢。

【问题讨论】:

  • 这很容易做到。如果其他人没有先得到答案,我会尽快发布答案。

标签: reactjs typescript


【解决方案1】:

处理这个问题的一种方法是将匿名箭头函数作为道具传递给每个人组件。你不能像现在这样将参数传递给 deletePersonH​​andler。

请尝试以下方法:

{
  this.state.persons.map((person,index) => {
  return (
      <Person 
        delete={() => this.deletePersonHandler(index)}
        name={person.name}
        age={person.age} 
      />
    )
  })
}

然后,在您的 Person 组件中,像这样附加 onClick 事件:

class Person extends React.Component<{ name: string, age: number }, {}>     {
  render() {
    return (
      <div onClick={this.props.delete}>
        <p> {this.props.name} and {this.props.age} </p>)
      </div>
    )
  }
}

Here 是一个与我在 Codepen 中尝试执行的操作有些相似的示例。单击 HTML 部分中的每个人,然后检查控制台中发生的情况。

附:我根本不使用 TypeScript,但请记住,您还需要在 Person 组件的 arguments 部分中声明要传递的函数。

【讨论】:

  • 谢谢丹尼尔。我首先使用 react 编写了代码,它工作正常,现在我正在尝试使用 typescript 来编写代码,但我遇到了很多困难。
  • 是的,我不使用 TypeScript,所以很遗憾,我认为我不能再提供任何帮助了。
  • 没问题。感谢您的帮助。
  • 对于类型尝试类似class Person extends React.Component&lt;{ name: string, age: number, deleteHandlerFn: (number) =&gt; void }, {}&gt; {
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 2021-02-26
  • 2012-03-30
  • 2013-08-04
  • 2010-09-13
  • 2018-08-24
  • 2014-02-07
相关资源
最近更新 更多