React之进一步了解state

本文通过一个具体案例展示了React中状态(state)的管理方法,包括如何更新state、展示数据及实现删除功能。

经过上一篇的介绍之后对state有了一个基本的了解,那么这一篇就是对state的进一步了解。下面我们还是通过一个小案例来进一步了解。
需求:点击按钮,获取文本框里面的内容,然后添加到下面,点击刚才添加的数据进行删除。
这里写图片描述
我们直接对上一篇的代码进行修改
1.首先,给state一个变量用来存放获取文本框的数据。names就是要存放的变量,代码如下:

constructor(props){
    super(props);
    this.state = {
        inputValue:'',
        names:[]
    }
}

2.修改btn的点击事件,把获取到的input数据放到names里面,目的是为了待会展示,代码如下:

handleBtnClick() {
    const names = this.state.names;
    names.push(this.state.inputValue);
    this.setState({
        names:names
    });
}

这里面的代码还可以用ES6的语法来写,代码如下:

handleBtnClick() {
    this.setState({
        names:[...this.state.names,this.state.inputValue]
    });
}

…arr这个展开式就是获取当前数组所有的数据,后面的一个变量就是新增的那个变量。

3.修改render()函数的返回内容,主要是添加了要显示的列表item,代码如下:

render(){
    return (
        <div>
            <div>
                <input onChange={this.handleInputChange.bind(this)} placeholder='input value and click btn' />
                <button onClick={this.handleBtnClick.bind(this)}>click me</button>
            </div>
            <div>
                <ul>
                    {
                        this.state.names.map((item,index)=>{
                           return <li key={index}>{item} <icon index={index} onClick={this.handleDelete.bind(this,index)}>×</icon></li>;
                        })
                    }
                </ul>
            </div>
        </div>
    );
}

上面代码中的this.state.names.map((item,index)=>{})是ES6对数组遍历的语法,index是下标,item是对应下标的值。另外这里需要注意的是,最外面的{}是JSX语法定义的,{}这个主要是获取变量的值。例如{index}显示的结果就是下标。这里给li了一个key,这个表示一个元素的索引,如果不给的话,控制台会报警告,所以还是给一个。这里还给icon标签了一个onClick事件,目的是点击的时候是否要删除,其代码如下:

handleDelete(index) {
    if (window.confirm("delete?")) {
        const names = this.state.names;
        names.splice(index, 1);
        this.setState({
            names: names
        });
    }
}

需要强调的一点就是我们不要直接操作state本身的值,而是通过一个变量先接收到state的值,然后对其进行修改,改完之后再赋值给state对应的变量(据说直接修改会有性能影响)。
完整代码如下:

import React, {Component} from 'react';

class ParentComponent extends Component {
    constructor(props){
        super(props);
        this.state = {
            inputValue:'',
            names:[]
        }
    }
    handleInputChange(e){
        this.setState({
            inputValue:e.target.value
        });
    }
    handleBtnClick() {
        const names = this.state.names;
        names.push(this.state.inputValue);
        this.setState({
            names:names
        });
    }
    handleDelete(index) {
        if (window.confirm("delete?")) {
            const names = this.state.names;
            names.splice(index, 1);
            this.setState({
                names: names
            });
        }
    }
    render(){
        return (
            <div>
                <div>
                    <input onChange={this.handleInputChange.bind(this)} placeholder='input value and click btn' />
                    <button onClick={this.handleBtnClick.bind(this)}>click me</button>
                </div>
                <div>
                    <ul>
                        {
                            this.state.names.map((item,index)=>{
                               return <li key={index}>{item} <icon index={index} onClick={this.handleDelete.bind(this,index)}>×</icon></li>;
                            })
                        }
                    </ul>
                </div>
            </div>
        );
    }
}
export default ParentComponent;

其实state还有很多的操作,目前就介绍这么多。下面是几个参考的地址:
(1)https://www.jianshu.com/p/c6257cbef1b1
(2)http://www.runoob.com/react/react-state.html
(3)https://reactjs.org/docs/state-and-lifecycle.html
最后一个是官网的,看起来吃力,但是很有用。

注释:
对数组的操作如果不是很好的,参考:http://www.w3school.com.cn/jsref/jsref_obj_array.asp
这个里面列举了很多的方法,遗忘的及时去复习,当然最好是在用到的时候再去,记忆更加深刻。

<think>好的,用户想了解Reactstate的用法和管理相关问题。首先,我需要回忆Reactstate的基本概念,比如state的作用,如何声明和使用,还有常见的状态管理方法。用户可能刚接触React,所以需要从基础讲起,但也要覆盖一些进阶内容,比如状态提升、Hooks的使用,以及可能的状态管理库如Redux或Context API。 接下来,我应该考虑用户的实际应用场景。他们可能在构建需要动态更新的组件,比如表单、计数器或者数据获取的界面。这时候,正确的状态管理能确保UI和数据的同步。需要注意类组件和函数组件在状态管理上的不同,特别是useState和useReducer这些Hooks的使用方法。 然后,用户可能遇到的常见问题包括状态更新的异步性、状态提升的时机、性能优化(如避免不必要的渲染),以及何时需要引入全局状态管理。这些问题都需要在回答中提及,并给出解决方案,比如使用useCallback、useMemo来优化,或者使用Context API来跨组件传递状态。 另外,需要检查是否有相关的引用内容可以支持回答。用户提供的引用主要关于事件驱动架构,可能与React的状态管理没有直接关系,但可以间接提到状态更新类似于事件驱动,比如用户交互触发状态变更,进而更新UI。不过这部分需要谨慎,避免混淆概念。 还要确保回答结构清晰,分点说明,比如基础用法、管理技巧、常见问题等。同时,生成的相关问题要围绕state的使用场景、优化方法、与props的区别,以及常见错误等方面,帮助用户进一步学习。 最后,验证示例代码的正确性,确保使用函数组件和Hooks,因为这是React目前的主流做法。同时,提醒用户关于状态不可变性的重要性,避免直接修改状态对象或数组,而是创建新的副本。</think>### React State用法与管理详解 React中的state是组件内部动态数据的核心管理机制。通过$useState$ Hook或类组件的$this.setState$方法实现数据驱动视图更新[^1]。 #### 一、基础用法 1. 函数组件使用$useState$: ```javascript import { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); // 初始值0 return ( <div> <p>点击次数:{count}</p> <button onClick={() => setCount(prev => prev + 1)}> 增加 </button> </div> ); } ``` 2. 类组件使用状态: ```javascript class Timer extends React.Component { constructor(props) { super(props); this.state = { seconds: 0 }; } componentDidMount() { this.interval = setInterval(() => { this.setState(prev => ({ seconds: prev.seconds + 1 })); }, 1000); } render() { return <div>已运行:{this.state.seconds}秒</div>; } } ``` #### 二、管理技巧 1. **状态提升**:兄弟组件通信需将state提升到共同父组件 ```javascript function Parent() { const [sharedValue, setValue] = useState(''); return ( <> <ChildA value={sharedValue} onUpdate={setValue} /> <ChildB value={sharedValue} /> </> ); } ``` 2. **复杂状态管理**:使用$useReducer$处理多状态关联 ```javascript const initialState = { count: 0 }; function reducer(state, action) { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; default: throw new Error(); } } function Counter() { const [state, dispatch] = useReducer(reducer, initialState); // 使用dispatch({ type: 'increment' }) } ``` #### 三、常见问题解决方案 1. **异步更新**:连续setState时使用函数式更新 ```javascript setCount(prev => prev + 1); ``` 2. **性能优化**:使用$useMemo$和$useCallback$避免重复渲染 ```javascript const memoizedValue = useMemo(() => computeExpensiveValue(a), [a]); const memoizedCallback = useCallback(() => doSomething(a), [a]); ``` 3. **全局状态**:使用Context API或Redux ```javascript const ThemeContext = createContext('light'); function App() { return ( <ThemeContext.Provider value="dark"> <Toolbar /> </ThemeContext.Provider> ); } ``` #### 四、最佳实践 1. 最小化state:只存储组件特有的交互状态 2. 不可变性原则:数组/对象使用新引用更新 3. 避免props派生state:使用$useEffect$监听props变化 4. 状态类型选择: - 局部交互:$useState$ - 复杂逻辑:$useReducer$ - 跨组件:Context/Redux
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值