如何在React中使用一个按钮重置多个计数器

aisflat439

我的问题的TLDR是我的每个子组件都保留并显示其自己的计数器点击。这些点击中的每一个也会更新Total显示的。我想知道如何使用Reset按钮来重置那些子组件。

我有一个显示总计的应用程序,多个按钮分别以不同的方式增加总计,还有一个重置按钮。在这个小的应用程序中,权重是一个充满不同权重对象的数组

class CountersContainer extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      total: 0,
    }
    this.resetTotal = this.resetTotal.bind(this)
    this.updateTotalByWeights = this.updateTotalByWeights.bind(this)
  }

  resetTotal = () => {
    this.setState({
      total: 0,
    })
  }

  updateTotalByWeights = value => {
    this.setState({ 
        total: this.state.total + value * 2,
      })
  }

  render() {
    return (
      <>
        <div className="container">
          {weights.map(w => (
            <Weight
              key={w.kg}
              incrementTotal={this.updateTotalByWeights}
              weight={w.kg}
            />
          ))}
        </div>
        <button className="click-target" onClick={this.resetTotal}>
          reset
        </button>
        <WeightOutput total={this.state.total} units={this.state.metric} />
      </>
    )
  }

/=============
// The weight component
/=============
import React from "react"

const Weight = ({ incrementTotal, weight }) => {

    return (
        <div onClick={() => { incrementTotal(weight) }} >
          {weight}
        </div>
    )
}

export default Weight

这很好。我希望每个Weight组件都保留其被点击次数的计数。因此,如果5kg两次单击权重分量,它将显示2的计数,并以所需的方式更新总数。因此,我在体重成分中添加了以下内容:

import React, { useState } from "react"

const Weight = ({ incrementTotal, weight }) => {
    const [count, setCount] = useState(0)

    return (
        <div
            onClick={
                () => { 
                        incrementTotal(weight) 
                        setCount(count + 1)
                    }
                }
         >  
                {count > 0 && <span>{count}</span>}
                {weight}
        </div>
    )
}

export default Weight

这样可实现合计正确地增加总期望值,并且每次单击都会更新组件计数。

但是,现在我需要更改我的“重置”按钮以重置每个重量组件,count而我完全不知如何处理。我考虑过的一些事情是迫使每个权重重新渲染,以使“计数”在层次结构中更进一步。也许“钩子”在这里是错误的实现(这个小应用程序主要是试图使钩子适应)。理想的答案将包括如何解决问题以及潜在的解决方案。

注意:我不确定上面的代码是否完美,我试图去除与该问题无关的部分。在下面,我添加了体重数据,以防万一有人好奇。

export const weights = [
         {
           color: "red",
           kg: 25,
           lbs: 55,
         },
         {
           color: "blue",
           kg: 20,
           lbs: 45,
         },
// this goes on a while.

更新

我已经更新了体重分量,使其看起来像这样:

import React, { useState, useEffect } from "react"

const Weight = props => {
    const [count, setCount] = useState(0)

    useEffect(() => {
      setCount(0)
    }, [props.reset])

    return (
      <div
        onClick={() => {
          props.incrementTotal(props.weight)
          setCount(count + 1)
        }}
      >
        {count > 0 && <span>{count}</span>}
        {props.weight}
      </div>
    )
}

export default Weight

并添加reset: 0到我的重置setState函数中。这并没有解决我的问题,但是根据React Hook Docs看来确实是一个有前途的方向。

更新2我接受了下面的答案,因为它是正确的,尽管我没有完全理解它。为了实施以下解决方案,我必须更新“重置”值。我通过了。

我不确定这是否是一个好的解决方案。我相信它会重新渲染所有重量分量。这可能是不好的,尤其是当有1000个复杂的组件时。

this.setState({
   reset: !this.state.reset
})
佐伊卜·伊亚兹(Zohaib Ijaz)

Weight每当您想重置计数器并使用useEffect带有依赖项的hook作为该道具时,都可以将值从父组件传递到子组件的道具传递给该道具。例如

class Parent extends React.Component {
  state = { reset: Date.now() };
  
  resetCounters = () => {
      this.setState({ reset: Date.now() });
  }
  render () {
    <div>
      <button onClick={this.resetCounters} >Reset</button>
      <Wieght reset={this.state.reset} {..some other props} />
      <Wieght reset={this.state.reset} {..some other props} />
      <Wieght reset={this.state.reset} {..some other props} />
      <Wieght reset={this.state.reset} {..some other props} />
    </div>
  }
}


const Weight = props => {
  const [counter, setCounter] = useState(0);
  useEffect(() => {
    setCounter(0);
  }, [props.reset]);

}

另一种选择是将reset密钥作为权重传递给重量组件,因此,在更改密钥时,它将重新安装。这是一个简单的解决方案,但可能导致大量重量组件出现性能问题

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何创建一个计数器作为组件多次使用并创建一个按钮来重置 React JS 中的所有计数器?

VBA如何在第3步的循环中使用带有计数器的计数器,每次仅增加一个计数器

如何使用React Hooks制作一个取决于两个按钮启动和停止的计数器?

如何在Flink中使用多个计数器

如何使用 Tkinter 制作一个计数器,显示按下按钮的次数

如何使用pandas和numpy在新的每一天重置一个计数器?

如何在“处理”中使用计数器或倒数计时器清除/重置画布?

如何在新的月份使用 Python 重置计数器

如何在jquery中使两个计数器按钮相互独立?

如何在同一页面中使用多个this.state计数器来增加单独的变量

在一个查询中更新多个计数器

我可以在一个 while 循环中使用 2 个计数器吗?

我如何创建一个单击时增加计数器的按钮?

在react中添加一个计数器

Javascript-如何在计时器达到 0 时重置按钮计数器

如何在另一个有状态操作中创建本地计数器

您如何在Javascript函数式编程中做一个简单的计数器?

如何在PHP中每个foreach完整循环增加一个计数器?

如何在VBscript-> MSSQL中创建一个简单的计数器

如何在我的标签布局中创建一个计数器,比如 Whatsapp?

如何在数组中的php中使用“两个”计数器?

如何增加一个简单的计数器

如何创建一个PHP登录计数器

如何在此代码中使用计数器?

如何在awk中使用计数器

如何在NiFi中使用计数器的值

如何在颤振中使用计数器?

使用React钩子实现一个自增计数器

如何重置计数器?