功能添加日志

上篇文章已经解决了我们用户输入后双向绑定,能在后台显示,并且清空的功能,那么这篇文章我们将我们获得的数据存到数组里面

在这里插入图片描述

logsDate用来存储学习的日志,这个数据除了当前组件logs需要使用外,logsform也需要使用,当遇到一个数据需要被多个组件使用的时候,我们可以将数据放入到这些组件共同的祖先元素中

子组件中的数据传递给父组件,父组件通过props向子组件传递一个回调函数,当我们的子组件获取到数据的时候调用回调函数,将这个数据传递给父组件,父组件收到后就可以进行操作!!

这么做的缺点:回调函数只适用于简单场景,如果中间隔了很多层,就需要其他方法了

logs.js

import LogItem from "./LogItem/LogItem";
import Card from '../UI/Card/Card.js'
import './Logs.css';
/*组件名应该和文件名一样 */
const Logs=(props)=>{
    //创建数据,将数据放入jsx中
    const LogItemDate= props.logsData.map((item)=><LogItem key={item.id} date={item.date} desc={item.desc} time={item.time}/>);


    return <Card className="logs">
    {
         LogItemDate
    }


    </Card>
}
//导出组件
export default Logs;

App.js

import Logs from "./Components/Logs/Logs.js"

import Card from "./Components/UI/Card/Card.js"

import LogsForm from "./Components/LogsForm/LogsForm.js"
import {useState}from "react"
import'./App.css'

//总组件!!!!!!!,这里引入其他组件的
/*组件名应该和文件名一样 */
const App=()=>{

    //数据
    const [logsData,setLogsData]=useState([
        {
            id:'01',
            date:new Date(2021,1,2,12,0),
            desc:"学习前端",
            time:"1"
        },
        {
            id:'02',
            date:new Date(2099,2,4,19,0),
            desc:"学习go",
            time:"2"
        },
        {
            id:'03',
            date:new Date(2034,3,6,17,0),
            desc:"学习java",
            time:"3"
        },
    ]);


    /**
     * 需要将logsform的数据传递给app组件,由app组件将新的日志添加到素组中
     * 
     * 子传父!!!!!!!!
     */
    //定义一个函数
    const saveLogHandler=(newLog)=>{
        //向新的日志中添加id,时间戳有并发的问题
        newLog.id=Date.now()+'';
        //将新数据添加到数组中
        setLogsData([...logsData,newLog])
        console.log("Appjs--->",newLog);
    }
    return <div className="app">
        {/*引入logsfrom*/}
        <LogsForm onSaveLog={saveLogHandler}/>
        <Logs logsData={logsData} />
    </div>
}

//导出组件
export default App;

logsform.js

import React from 'react';
import {useState} from 'react';
import Card from "../UI/Card/Card.js";
import './LogsForm.css';

const LogsForm =(props)=>{

    console.log(props.onSaveLog);

    const [inputDate,setInputDate]=useState('');
    const [inputDesc,setInputDesc]=useState('');
    const [inputTime,setInputTime]=useState('');
    //监听date变化
    const dateChangeHandler=(e)=>{
        setInputDate(e.target.value)
    };

    //创建一个响应函数,监听内容
    const descChangeHandler=(e)=>{
        setInputDesc(e.target.value)
    };
    //监听time
    const timeChangeHandler=(e)=>{
        setInputTime(e.target.value)
    };

    //当我们的表单提交的时候我们要汇总表单的数据,监听提交事件
    const formSubmitHandler=(e)=>{
        e.preventDefault();

        const newLog={
            date:new Date(inputDate),
            desc:inputDesc,
            time:+inputTime
        };
        //当添加新日志的时候,调用父组件传递过来的函数
        props.onSaveLog(newLog);
        //清空表达
        setInputDate('');
        setInputDesc('');
        setInputTime('');
        console.log(newLog);
    };


    return (
        <Card className="logs-form">
            <form onSubmit={formSubmitHandler}>
                <div className="form-item">
                    <label htmlFor="date">日期</label>
                    <input  onChange={dateChangeHandler} value={inputDate} id="date" type="date"></input>
                </div>
                <div className="form-item">
                    <label htmlFor="desc">内容</label>
                    <input onChange={descChangeHandler} value={inputDesc} id="desc" type="text"></input>
                </div>
                <div className="form-item">
                    <label htmlFor="time">时长</label>
                    <input  onChange={timeChangeHandler} value={inputTime} id="time" type="number"></input>
                </div>
                <div className="form-btn">
                    <button>添加</button>
                </div>
            </form>
        </Card>
    )
}


export default LogsForm;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值