TS中的基础开发|青训营笔记

140 阅读4分钟

TypeScripts的基础开发|青训营笔记

这是我参与「第四届青训营 」笔记创作活动的的第3天。今天预习了js课程,恰好工作室给了个小任务,就是当 小预习作业啦!

一、本节课重点内容:

今天的课程安排了Javascripts的基础复习,通过一个小案例复习了js/ts中的基础时间。
学习了React中DOM的操作。JS中拥有很多小技巧:包括字符串的整理,map()方法等。

二、课堂知识点纪要:

  • Typescript中的接口

    Typescript是一种基于js开发的超集,通过将程序语言编译为JS脚本语言执行,
    在Javascript的基础上拓展出了许多功能,interface接口就是其中一种
    
    在TS中,变量的显示值会受到严格的限制:
    interface的作用在于声明数据结构中变量类型,例:
    
    interface infomation{
        name:string,
        ismale:boolen,
        age:number,
        address:any
        hair:undefined
    }
    
    代码中可以发现,typescript中多出any数据类型,any表示任意数据类型,当
    数据结构中不需要严格限制类型时可以使用。
    
  • props参数申明

       当在使用组件的props传参时,若不声明数据类型,TS会认为该数据不安全报未定义。
       正确的使用方法是在声明组件参注释其类型,声明的类型可以是基础的数据类型,也可以是接口定义的结构,还可以是class类。 例:
       
    
    • interface类:

         interface idcard{
            name:string,
            ismale:boolen,
            age:number
         }
      
         class Numb extends React.Component<any,idcard> {
             constructor(props:any){
                 super(props);
             }
             render() {
                 return (
                     <span>name:{this.idcard.name} </span>
                     <span>gender:{this.idcard.ismale?male:female} </span>
                     <span>age:{this.idcard.age} </span>
                 )
             }
         }
      
    • class类、普通数据类型申明:

         class noteData {
             notice:string
             status:number
             key:string
             constructor(notice:string,
                         status:number,
                         key:string) {
                 this.notice = notice ;
                 this.status = status ;
                 this.key = key
             }
         }
      
      
         class Notes extends React.Component<any, {dataList:noteData[],temp:string}>{
             constructor(props:any) {
                 super(props);
                 this.state = {
                     dataList:[
                      {notice: '今天去吃饭', status:0 ,key:"sub-0-1"},   //状态码0 未完成
                      {notice: '吃完吃雪糕', status:1 ,key:"sub-0-2"},   //状态码1 亟待完成
                      {notice: '吃完吃雪糕', status:2 ,key:"sub-0-3"},     //状态码2 已完成
                     ],
                     temp:' '
                 }
             }
             render(){
                 return{ 
                 }
             }
         }
      
    • 函数组件申明变量

              const AC =(props:any)=>{
                 return(
                     <button className={"square"} onClick={props.onClick}>AC</button>
                 )
             }
      
  • 使用js定时函数时,需要回调函数

      getTime(val?:any){
          var now:any =  new Date();
          var endTime = val[1]._d
          var delta = (endTime - now)/1000;
          var D:number = delta / 60 / 60 / 24;
          var H:number = delta / 60 / 60 % 24;
          var M:number = delta / 60 % 60;
          this.setState({D,H,M,end:String(endTime)})
      }
    
    • 对于上面这个函数做一个定时轮询,使用第一种写法是不可行的,会导致getTime找不到this.state.dateValue

         setInterval(this.getTime(this.state.dataValue), 2000)
      
    • 必须构造一个回调函数,这里可以用箭头函数实现回调。

      setInterval(()=>{
          this.getTime(this.state.dataValue)
      }, 2000)
      
    • 请教了工作室的师兄,这个问题就出在当直接调用state里的变量作函数参数时,this.state 的this 指向的并不是state,而是指向了界面windows,就找不到这个函数下的所有state。

    • 在定时器函数里想用this需要靠箭头函数的特性借用this或者通过call apply bind绑定this。

三、实践练习案例:

今天基于React和Style.js实现一个基本功能的计算器:

Styled-Component样式

//Authored by iiru
//powerby styled.js
import styled from "styled-components";
//主体容器盒子
export const MainContain =styled.div`   
   width:100%;
   height:1000px;
   background-image: linear-gradient(to right, #f49ecb,#d94bcc);
  
  .monitor{
   margin:5% 25% 0 25%;
   width:500px;
   height:16%;
   background:#391a33;
  }
  .keyboard{
   margin:0 25% 5% 25%;
   height:50%;
   width:500px;
   background:#efefef;
  }
`//显示器样式
export const Monitor =styled.div`
  .formula{
    margin:4%;
    font-size:28px;
    color:#ffffff;
  }
  .equation{
     margin:4%;
     float:right;
     font-size:32px;
     color:#efefef;
  }
`
//键盘样式
export const Keyboard =styled.div`
    .cubic{
     font-size:28px;
     margin:0.5%;
     width:24%;
     height:19%;
     background:#fae1f2;
     border:none;
    }
    .square{
    font-size:28px;
    margin:0.5%;
     width:49%;
     height:19%;
     background:#fae1f2;
      border:none;
    }
    
`

Typecripts 代码 注意引入依赖哦 代码以及做好模块化封装

//Authored by iiru
//powerby styled.js
import React  from "react";
import { MainContain,Monitor,Keyboard} from "./caculate";

export function Caculator() {

    interface numb{
        num:any
    }

    const AC =(props:any)=>{
        return(
            <button className={"square"} onClick={props.onClick}>AC</button>
        )
    }
    const Delete =(props:any)=>{
        return(
            <button className={"cubic"}  onClick={props.onClick}>清除</button>
        )
    }
    const Plus =(props:any)=>{
        return(
            <button className={"cubic"}  onClick={props.onClick}>+</button>
        )
    }
    const Sub =(props:any)=>{
        return(
            <button className={"cubic"}  onClick={props.onClick}>-</button>
        )
    }
    const Times =(props:any)=>{
        return(
            <button className={"cubic"}  onClick={props.onClick}>*</button>
        )
    }
    const Devide =(props:any)=>{
        return(
            <button className={"cubic"}  onClick={props.onClick}>/</button>
        )
    }
    const Equal =(props:any)=>{
        return(
            <button className={"square"}  onClick={props.onClick}>=</button>
        )
    }

    class Numb extends React.Component<any,numb> {
        constructor(props:any){
            super(props);
        }
        render() {
            return (
                <button className={"cubic"} onClick={this.props.onClick}>{this.props.numb}</button>
            )
        }
    }
    //显示器显示计算结果
    class Equation extends React.Component<any> {
        constructor(props:any){
            super(props);
            console.log(props)
        }
        render() {
            return (
                <span>{this.props.equation}</span>
            )
        }
    }
    
    //显示器显示计算公式
    class Formula extends React.Component<any> {
        constructor(props:any){
            super(props);

        }
        render() {
            return (
                <p className={"formula"} >{this.props.formula}</p>
            )
        }
    }
    class Caculators extends React.Component{
        //声明一个私有类
        private ans: { equation: number; formula: string };
        constructor(props:any){
            super(props);
            this.ans={
                formula:"hhhhh",
                equation: 0
            }
        }
        //清空公式
        handleAC(){
            console.log("AC")
            this.ans.formula=""
            this.ans.equation= 0
            this.setState({})
        };
         //回退一格
        handleDel(){
            this.ans.formula=this.ans.formula.substr(0,this.ans.formula.length - 1)
            this.setState({})
        };
        //计算求结果
        handleEqual(){
            this.ans.equation= eval((this.ans.equation?String(this.ans.equation):"0+")+this.ans.formula)
            this.ans.formula= " "
            this.setState({})
        };
         //处理显示器公式
        handle(e:any){
            console.log(typeof e)
            this.ans.formula=this.ans.formula+e;
            this.setState({})
        };

        render() {
            return (
                <MainContain>
                    {/*显示器*/}
                    <Monitor className={"monitor"}>
                        <Formula formula={this.ans.formula}></Formula>
                        <p className={'equation'}>
                            <span>= </span>
                            <Equation equation={this.ans.equation}></Equation>
                        </p>
                    </Monitor>
                    {/*键盘区*/}
                    <Keyboard className={"keyboard"}>
                        <AC onClick={() => this.handleAC()}></AC>
                        <Delete onClick={() => this.handleDel()}></Delete>
                        <Devide onClick={() => this.handle("/")}></Devide>

                        <Numb numb={"1"} onClick={() => this.handle("1")}></Numb>
                        <Numb numb={"2"} onClick={() => this.handle("2")}></Numb>
                        <Numb numb={"3"} onClick={() => this.handle("3")}></Numb>
                        <Times onClick={() => this.handle("*")}></Times>

                        <Numb numb={"4"} onClick={() => this.handle("4")}></Numb>
                        <Numb numb={"5"} onClick={() => this.handle("5")}></Numb>
                        <Numb numb={"6"} onClick={() => this.handle("6")}></Numb>
                        <Plus onClick={() => this.handle("+")}></Plus>

                        <Numb numb={"7"} onClick={() => this.handle("7")}></Numb>
                        <Numb numb={"8"} onClick={() => this.handle("8")}></Numb>
                        <Numb numb={"9"} onClick={() => this.handle("9")}></Numb>
                        <Sub onClick={() => this.handle("-")}></Sub>

                        <Numb numb={"."} onClick={() => this.handle(".")}></Numb>
                        <Numb numb={"0"} onClick={() => this.handle("0")}></Numb>
                        <Equal onClick={() => this.handleEqual()}></Equal>
                        //使用回调函数props传入onClick事件给button
                    </Keyboard>
                </MainContain>  )
        }
    }

    return (
        <>
            <Caculators></Caculators>
        </>
    );
};

实现效果:

451fx-xw0ti.gif

四、参考文献:

五、心得体会:

通过今天的学习加深了对React组件封装的认识,实现了一个基于Typescript语法的小项目,发现了很多问题,有幸得以及时解决。学习前端需要及时总结归纳,将问题转化为经验。