likes
comments
collection
share

从0开始用hooks搭建一个事件待办的demo(一)

作者站长头像
站长
· 阅读数 49

需求一:实现header,点击加号展示input,再次点击隐藏input

从0开始用hooks搭建一个事件待办的demo(一)

从0开始用hooks搭建一个事件待办的demo(一)

分析:

首先,需要两个子组件header和addInput;

header组件负责展示图一的内容,给加号添加一个点击事件,来触发展示input的函数;

用一个布尔值表示addInput的展示与否;

这个展示input的函数和负责展示addInput组件的布尔值需要从父组件传递过来。

//app.js
import React, { useState } from "react";
import "./App.css";
import Header from "./componens/Header";
import AddInput from "./componens/addInput";

function App() {
  //给子组件addInput默认为不展示的初始值
  const [isInputShow,setIsInputShow] = useState(false);
  //点击加号之后就对布尔值取反
  const openInput = ()=>{
    setIsInputShow(!isInputShow)
  }
  
  return (
    <div className="App">
      //将函数传给子组件
      <Header openInput={openInput}></Header>
      //将这个初始值传递给子组件
      <AddInput isInputShow={isInputShow}></AddInput>
    </div>
  );
}
//header.js
import React from 'react';
import './index.scss'

function Header(props){
    //解构从父组件拿到openInput函数
    const {openInput} = props 
    
    return(
        <div className='header'>
            <h1>备忘录</h1>
            //给加号添加一个点击事件,触发openInput函数
            <span onClick={openInput}>+</span>
        </div>
    )
}

export default Header;
//addInput.js
import React from "react";
import "./index.scss";

function AddInput(props) {
  //解构从父组件拿到布尔值
  const { isInputShow } = props;
  
  return (
    <>
    //如果这个布尔值为真就展示这个组件
      {isInputShow ? (
        <div className="addInput">
          <input type="text" />
          <button>添加</button>
        </div>
      ) : (
        ''
      )}
    </>
  );
}

export default AddInput;

需求二:点击添加之后提交数据并情况表单

分析:

在点击了添加按钮之后触发一系列功能,所以先给button添加点击事件函数;

在这个函数中需要完成3件事:拿到表单的value值并判空,提交数据到父组件,清空表单

提交数据到父组件:由父组件抛给子组件addItem函数,子组件触发该函数时将参数传递过去

addItem函数完成两件事:将子组件传递过来的value值放入新对象中,给每一个list数据一个单独的id,内容和是否完成的布尔值属性。然后用合并到data列表中

//app.js
import React, { useState } from "react";
import "./App.css";
import Header from "./componens/Header";
import AddInput from "./componens/addInput";

function App() {
  const [isInputShow,setIsInputShow] = useState(false);
  //初始化出备忘录事件列表项,初始值为空数组
  const [dataList , setDataList] = useState([])
  
  const openInput = ()=>{
    setIsInputShow(!isInputShow)
  }
  
  //该函数执行提交数据的功能,将子组件传递来的value合并到旧的data列表中
  const addItem = (value)=>{
    const dataItem = {
      id:new Date().getTime(),
      content:value,
      //是否完成当前项
      isComplete:false
    }
    const newDatas =  [...dataList,dataItem]
    setDataList(newDatas)  
  }
  
  return (
    <div className="App">
      <Header openInput={openInput}></Header>
      //父组件抛出addItem函数给子组件去触发
      <AddInput isInputShow={isInputShow} addItem={addItem}></AddInput>
    </div>
  );
}

export default App;
//addInput.js
import React,{ useRef } from "react";
import "./index.scss";

function AddInput(props) {
  //从父组件中解构拿到一个添加列表项的addItem函数
  const { isInputShow , addItem } = props;
  const inputRef = useRef()
  
  //提交函数
  const submitValue = ()=>{
    //利用引用拿到value并判空
    const value = inputRef.current.value.trim();
    if(value.length===0) return;
    // 传递当前value参数到addItem函数,将提交数据到列表这个功能交给父组件
    addItem(value)
    // 清空input
    inputRef.current.value = ''
  }
  
  return (
    <>
      {isInputShow ? (
        <div className="addInput">
          <input ref={inputRef}  type="text" />
          //点击添加按钮触发提交函数
          <button onClick={submitValue}>添加</button>
        </div>
      ) : (
        ''
      )}
    </>
  );
}

export default AddInput;

做到这一步就完成了数据的提交,但还不能够显示在页面上,可以在控制台打印看到数据

剩下的步骤明天再写叭!

从0开始用hooks搭建一个事件待办的demo(一)

转载自:https://juejin.cn/post/7174746727935803451
评论
请登录