使用React Hooks做一个todolist

import React, { useState, useEffect, useRef, createContext } from 'react'
import "./todo.css"
import Starts from "./starts"
export const CountContext = createContext()

function Title() {
    return <div className="Title"><h1>Todos</h1></div>
}

function Add(props) {
    let [val, setVal] = useState("")
    // let input=useRef()

    let { addData, all, unall } = props
    return (
        <div>
            <button id="all"
                onClick={() => {
                    all()
                }}
            >全选</button>
            <button id="all"
                onClick={() => {
                    unall()
                }}
            >反选</button><input id="new-todo" placeholder="What needs to be done?"
                autoComplete="off" type="text" value={val}
                onChange={({ target }) => setVal(target.value)}
                onKeyDown={(e) => {
                    if (e.code === "Enter") {
                        addData(val)
                        setVal("")
                    }
                    // console.log(e.code)
                }}
            />
        </div>
    )

}
function Li(props) {
    let { data, remove, changeDone } = props
    let { id, done, txt } = data
    let [edit, setEdit] = useState("")
    let editInput = useRef()
    useEffect(() => {
        if (edit) {
            editInput.current.focus()
        }
    }, [edit])
    // console.log(data)
    return (
        <li className={edit ? "editing" : ""}>
            <div className={"todo " + (done ? "done" : "")}>
                <div className="display">
                    <input
                        className="check"
                        type="checkbox"
                        checked={done}
                        onChange={({ target }) => {
                            changeDone(id, target.checked)
                        }} />
                    <div className="todo-content"
                        onDoubleClick={() => {
                            setEdit(true)
                        }}
                    >
                        {txt}
                    </div>
                    <span className="todo-destory"
                        onClick={() => {
                            remove(id)
                        }
                        }
                    >×</span>
                </div>
                <div className="edit" >
                    <input className="todo-input" type="text"
                        onBlur={() => {
                            setEdit(false)
                        }
                        }
                        value={txt}
                        onChange={({ target }) => {
                            // value=target.value
                        }
                        }
                        ref={editInput} />
                </div>
            </div>
        </li>
    )
}


function Todolist(props) {
    let { data } = props
    return (
        <ul id="todo-list">
            {
                data.map(item => {
                    return <Li
                        {...props}
                        key={item.id}
                        data={item} />
                })
            }
        </ul>
    )
}

function TodoApp() {
    let [data, setData] = useState([
        {
            id: 0,
            txt: "内容-1",
            done: false
        },
        {
            id: 1,
            txt: "内容-2",
            done: true
        },
        {
            id: 2,
            txt: "内容-3",
            done: false
        }, {
            id: 3,
            txt: "内容-4",
            done: true
        },
    ])
    const [showArr, setShowArr] = useState([...data]);
    // 当 data 发生改变时,执行该 effect,替换 showArr
    useEffect(() => {
        setShowArr([...data]);
    }, [data]);

    let addData = (txt) => {
        data.push({
            id: Date.now(),
            txt,
            done: false
        });
        setData([...data])
        console.log(data)
    }
    //删除数据
    let remove = (id) => {
        setData(data.filter(item => {
            return item.id !== id
        }))

    }
    //删除已选中
    let del = () => {
        setData(prevState => {
            return prevState.filter(item => !item.done)
            // const copy = [...prevState]
            // copy.forEach(item => {
            //     item.done = false
            // });
            // return copy;
        })

    }
    //切换选中
    let changeDone = (id, done) => {
        data.forEach(item => {
            if (item.id === id) {
                item.done = done
            }
        })
        setData([...data])
    }
    //全选
    let all = () => {
        setData(prevState => {
            const copy = [...prevState]
            copy.forEach(item => {
                item.done = true
            })
            return copy
        })
    }
    //反选
    let unall = () => {
        setData(prevSta => {
            const copyt = [...prevSta]
            copyt.forEach(item => {
                if (item.done) {
                    item.done = false
                } else {
                    item.done = true
                }
                console.log(item.done)
                // item.done = !item.done
            }
            )
            return copyt
        })
        // setData([...data])
    }
    // let unDoneData = data.filter(item => !item.done)
    // let DoneData = data.filter(item => item.done)
    let showStatusList = (showStatus) => {
        if (showStatus === "complete") {
            const newdata = data.filter(item => item.done)
            setShowArr([...newdata])
            console.log(showArr)
        } else if (showStatus === "active") {
            const newdata = data.filter(item => !item.done)
            setShowArr([...newdata])
            console.log(showArr)
        } else {
            setShowArr([...data])

        }
    }

    return (
        <div id="todoapp">
            <Title />
            <div className="content">
                <Add addData={addData} all={all} unall={unall} />
                <Todolist
                    data={data}
                    remove={remove}
                    changeDone={changeDone}
                    showArr={showArr} />
                <CountContext.Provider value={{ data, del, showStatusList }}>
                    <Starts />
                </CountContext.Provider>
                {/* <Starts data={data}
                    del={del} 
                    /> */}
            </div>
        </div>
    )
}

export default TodoApp

todolist底部bar(分开写,使用上下文对象)

import React, { useContext} from 'react'

import {CountContext} from "./todo"

function Starts() {
    let {data,del,showStatusList} = useContext(CountContext)
    let unDoneData = data.filter(item => !item.done)
    let DoneData = data.filter(item => item.done)
    return (
        <div>
            <span> {unDoneData.length} 未完成</span>
            <span> {DoneData.length} 已完成</span>
            <span 
                className="quan"
                onClick={()=>{
                    showStatusList("all")
                    console.log("com")
                }}>All</span>
            <span 
                className="active"
                onClick={()=>{
                    showStatusList("active")
                }}>Active</span>
            <span 
                className="completed"
                onClick={()=>{
                    showStatusList("complete")
                }}>Completed</span>

            <span className="com"
                onClick={del}
            >Clear completed</span>
        </div>
    )
}
export default Starts

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统 以下是一个使用React Hooks设计学生成绩管理系统的简单示例: 1. 首先,我们需要导入React和useState Hook。useState Hook可以帮助我们在函数组件中使用状态。 ``` import React, { useState } from 'react'; ``` 2. 我们需要一个数组来存储学生的成绩。我们可以使用useState Hook来创建它: ``` const [grades, setGrades] = useState([]); ``` 3. 接下来,我们需要一个表单来让用户输入学生成绩。我们可以使用useState Hook来创建一个表单状态: ``` const [formData, setFormData] = useState({ name: '', grade: '' }); ``` 4. 然后,我们需要一个函数来处理表单提交。该函数将获取用户输入的名称和成绩,并将其添加到成绩数组中: ``` const handleSubmit = (event) => { event.preventDefault(); setGrades([...grades, formData]); setFormData({ name: '', grade: '' }); }; ``` 5. 然后,我们需要一个函数来渲染表单。该函数将包含一个文本框来输入学生的名称,以及一个下拉列表来选择学生的成绩: ``` const renderForm = () => { return ( <form onSubmit={handleSubmit}> <label> Name: <input type="text" value={formData.name} onChange={(event) => setFormData({ ...formData, name: event.target.value }) } /> </label> <label> Grade: <select value={formData.grade} onChange={(event) => setFormData({ ...formData, grade: event.target.value }) } > <option value="">Select a grade</option> <option value="A">A</option> <option value="B">B</option> <option value="C">C</option> <option value="D">D</option> <option value="F">F</option> </select> </label> <button type="submit">Add Student Grade</button> </form> ); }; ``` 6. 最后,我们需要一个函数来渲染成绩列表。该函数将遍历成绩数组并将每个学生的名称和成绩显示在列表中: ``` const renderGrades = () => { return ( <ul> {grades.map((grade, index) => ( <li key={index}> {grade.name} - {grade.grade} </li> ))} </ul> ); }; ``` 7. 现在,我们可以在函数组件中使用这些函数来渲染整个学生成绩管理系统: ``` const StudentGrades = () => { const [grades, setGrades] = useState([]); const [formData, setFormData] = useState({ name: '', grade: '' }); const handleSubmit = (event) => { event.preventDefault(); setGrades([...grades, formData]); setFormData({ name: '', grade: '' }); }; const renderForm = () => { // ... }; const renderGrades = () => { // ... }; return ( <div> <h1>Student Grades</h1> {renderForm()} {renderGrades()} </div> ); }; ``` 这是一个简单的使用React Hooks设计的学生成绩管理系统。您可以根据需要添加更多功能,例如删除成绩,编辑成绩等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值