代码之家  ›  专栏  ›  技术社区  ›  Nhat

为什么这个.setState在我的案例中有效

  •  1
  • Nhat  · 技术社区  · 6 年前

    我只是试图创建一个非常简单的应用程序,我将输入一个数字,计算机将生成与该数字的框,并改变一个框的颜色,一次随机。代码工作,但我不明白为什么它工作,在随机闪烁函数我只需要有这个。设置状态({})或更奇怪的是,我可以只是这个状态的任何东西。设置状态({})和代码将工作相同,它将每1秒更改一个随机框的颜色。我把应用程序缩减到我不明白的部分,有人能帮我回答这个问题吗。

    import React from 'react';
    import CubeRender from '../therapeuticEffect/CubeRender';
    import '../therapeuticEffect/style.css';
    
    class TherapeuticEffect extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            cubeArray: [],
            cubeNumber: 0,
            cubeSize: 100,
        }
        this.blinking = null;
    }
    
    onNumberChange = (event) => {
        this.setState({ [event.target.name]: event.target.value })
    }
    
    onFormSubmit = (event) => {
        event.preventDefault();
        clearInterval(this.blinking);
        this.cubeArrayRender();
    }
    
    cubeArrayRender = () => {
        let { cubeNumber } = this.state;
    
        let cubes = parseInt(cubeNumber, 10);
    
        let array = cubes ? Array(cubes).fill() : [];
        let cubeArray = array.length === 0 ? [] : array.map((c) => (this.randomColor()));
        this.setState({ cubeArray })
        this.randomBlinking();
    }
    
    randomBlinking = () => {
        this.blinking = setInterval(() => {
            const array = this.state.cubeArray;
                const randIndex = Math.floor(Math.random() * array.length);
                array[randIndex] = this.randomColor();
    
                //HOW COULD THIS WORK
    
                this.setState({})
        }, 500);
    }
    
    randomColor = () => {
        let r = Math.floor(Math.random() * 256);
        let g = Math.floor(Math.random() * 256);
        let b = Math.floor(Math.random() * 256);
        let color = `rgb(${r}, ${g}, ${b})`
        return color;
    }
    
    render() {
        const { cubeArray, cubeNumber, cubeSize } = this.state
        return (
            <div>
                <form className='menu-bar' onSubmit={this.onFormSubmit}>
                    <div>
                        <label>cube number </label>
                        <input type='number' name='cubeNumber' value={cubeNumber} onChange={this.onNumberChange} />
                    </div>
    
                </form>
    
                <CubeRender
                    cubeArray={cubeArray}
                    cubeSize={cubeSize}
                />
            </div>
        )
    }
    

    }

    1 回复  |  直到 6 年前
        1
  •  2
  •   Tholle    6 年前

    你直接通过写作来改变你的状态 array[randIndex] = this.randomColor() . 仅此项(不推荐)不会重新渲染组件。当你写信的时候 this.setState({}); 组件将使用您刚刚更改的状态重新呈现。

    您可以创建 cubeArray 用随机颜色排列和覆盖随机索引,并用它更新状态。

    randomBlinking = () => {
      this.blinking = setInterval(() => {
        this.setState(previousState => {
          const cubeArray = [...previousState.cubeArray];
          const randIndex = Math.floor(Math.random() * cubeArray.length);
    
          cubeArray[randIndex] = this.randomColor();
    
          return { cubeArray };
        });
      }, 500);
    };