【React】函数组件 hooks-useState

使用hooks理由

  1. 高阶组件为了复用,导致代码层级复杂
  2. 生命周期的复杂
  3. 写成functional组件,无状态组件 ,因为需要状态,又改成了class,成本高

useState(保存组件状态)

useState的具体语法如下,我们用他来实现一个数值的切换和todolist

const [state, setstate] = useState(initialState)

切换数值

import React,{useState} from 'react'

export default function App() {
    const [name, setName] = useState("小明")
    const [age, setAge] = useState(18)
  return (
    <div>
        <button onClick={()=>{
            setName("小红")
            setAge(100)
        }}>click</button>
        app-{name}-{age}
    </div>
  )
}

实现todolist增加和删除

1)整体思路,新建一个input 通过onChange={}调用方法获取input失焦之后输入框内的值,通过状态usestate的settext函数存储在text中,input后面新建button按钮触发数据传输,传输目标为list数组,因此新建一个存储数变量list,通过setlist([…list,text]),扩展运算符把数组list中的元素和text取到的元素组成新的数组,

2)list.map()渲染列表下的新数组,完成添加后的列表,每一个li列表元素后面新增一个button按钮del删除。onclick事件绑定buttonn,通过map的第二个元素拿到每个item的index值,拷贝数组之后,通过数组的splice()方法删除对应index的元素将得到的新数组通过setlist放入到变量list中,通过list.map()重新渲染列表页面

3)最后如果列表为空,即,列表的长度为0时,显示“暂无数据”

import React,{useState} from 'react'

export default function App() {
    const [text, setText] = useState("")
    const [list, setList] = useState(["aa","bb","cc"])
    const handleChange = (evt) =>{
        // console.log("handleChange",evt.target.value);
        setText(evt.target.value)
    }
    const handleAdd = () =>{
        console.log(text)
        {text && 
            setList([...list,text])
        }
        //清空
        setText("")
    }
    const handleDel = (index)=>{
        console.log(index);
        var newList = [...list]
        newList.splice(index,1)
        setList(newList)
    }
  return (
    <div>
        {/* 要想清空,让input标签变成受控的  value */}
        <input onChange={handleChange} value={text}/>
        <button onClick={handleAdd}>增加</button>
        <ul>
        {
            list.map((item,index)=>
                <li key={item}>{item}
                <button onClick={()=>{handleDel(index)}}>删除</button>
                </li>
                )
        }
        </ul>
        {!list.length&& <div>暂无待办事项</div>  }
    </div>
  )
}

最终结果

在这里插入图片描述
按del删除按钮后删除所有元素,list长度为0,显示暂无数据
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值