javascript - React - 改变 this.state onClick 用 array.map() 呈现

标签 javascript reactjs

我是 React 和 JavaScript 的新手。

我有一个 Menu 组件,它呈现一个动画 onClick,然后将应用程序重定向到另一个路径,/coffee

我想将单击(选择)的值传递给函数 this.gotoCoffee 并更新 this.state.select,但我不知道如何,因为我在同一 onClick 事件中映射 this.state.coffees 中的所有项目。

我如何做到这一点并将 this.state.select 更新为点击值?

我的代码:

class Menus extends Component{
  constructor (props) {
    super(props);
    this.state = { 
        coffees:[],
        select: '',      
        isLoading: false,
        redirect: false
    };
  };
  gotoCoffee = () => {
    this.setState({isLoading:true})
    setTimeout(()=>{
      this.setState({isLoading:false,redirect:true})
    },5000)
  }

  renderCoffee = () => {
    if (this.state.redirect) {
      return (<Redirect to={`/coffee/${this.state.select}`} />)
    }
  }

  render(){
    const data = this.state.coffees;

    return (
      <div>
        <h1 className="title is-1"><font color="#C86428">Menu</font></h1>
        <hr/><br/>
        {data.map(c => 
          <span key={c}>
            <div>
               {this.state.isLoading && <Brewing />}
               {this.renderCoffee()}
              <div onClick={() => this.gotoCoffee()} 
                  <strong><font color="#C86428">{c}</font></strong></div>
            </div>
          </span>)
        }
      </div>
    );
  }
}

export default withRouter(Menus);

我试过像这样传递值:

  gotoCoffee = (e) => {
    this.setState({isLoading:true,select:e})
    setTimeout(()=>{
      this.setState({isLoading:false,redirect:true})
    },5000) 
    console.log(this.state.select)
  }

像这样:

<div onClick={(c) => this.gotoCoffee(c)} 

左右:

<div onClick={(event => this.gotoCoffee(event.target.value} 

但是 console.log(this.state.select) 两次尝试都显示“undefined”。

看来我正在传递带有“c”的 Class

浏览器在重定向的 uri 上准确地向我显示:

http://localhost/coffee/[object%20Object]


现在,如果我将映射的“c”传递给 {this.renderCoffee(c)},这不是一个 onClick 事件,我就会设法传递数组项。

但我需要传递的不是对象,而是单击值“c”到 this.gotoCoffee(c),然后更新 this.state.select

我该如何解决这个问题?

最佳答案

您可以将元素的 index 传递给 gotoCoffee 并在 render 中关闭。然后在 gotoCoffee 中,只需访问该元素作为 this.state.coffees[index]

gotoCoffee = (index) => {
    this.setState({isLoading:true, select: this.state.coffees[index]})
    setTimeout(()=>{
      this.setState({isLoading:false,redirect:true})
    },5000)
  }

  render(){
    const data = this.state.coffees;

    return (
      <div>
        <h1 className="title is-1"><font color="#C86428">Menu</font></h1>
        <hr/><br/>
        {data.map((c, index) => 
          <span key={c}>
            <div>
               {this.state.isLoading && <Brewing />}
               {this.renderCoffee()}
              <div onClick={() => this.gotoCoffee(index)} 
                  <strong><font color="#C86428">{c}</font></strong></div>
            </div>
          </span>)
        }
      </div>
    );
  }
}

关于javascript - React - 改变 this.state onClick 用 array.map() 呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57581731/

相关文章:

javascript - 在禁用浏览器 Flash 插件的情况下运行 Karma 测试

javascript - 与这些 javascript DOM 对象/方法等效的 jQuery 是什么?

javascript - 如何向 React/MUI 自动完成组件添加唯一键?

reactjs - 两个不同的 "strategies"的设计模式,它们没有实现相同的接口(interface)

javascript - renderSortByOptions() 有什么作用?

javascript - 如何在 IgGrid 单元格(Infragistics)中获取正则表达式?

javascript - 尽管链中遭到拒绝,链式 promise 仍在继续执行

css - React 路由器中的 activeClassName 同时突出显示两个 NavLink

javascript - 使用适当的状态/ Prop react 自修改组件

javascript - 防止像figma那样放大网页,