前端工作问题积累

495 阅读4分钟

时间格式 2020-06-02T16:00:00.000Z

function formatDate(datetime) {
  const addDateZero = (num) => {
    return (num < 10 ? "0" + num : num);
  };
  const d = new Date(datetime);
  const f = d.getFullYear() + '-'
    + addDateZero(d.getMonth() + 1) + '-'
    + addDateZero(d.getDate()) + ' '
    + addDateZero(d.getHours()) + ':'
    + addDateZero(d.getMinutes()) + ':'
    + addDateZero(d.getSeconds());
  return f;
}
formatDate('2020-06-02T16:00:00.000Z')
"2020-06-03 00:00:00"

获取浏览器URL地址

//获取的是浏览器hash路由地址
window.location.hash;
//或者可以用
window.location.pathname;

改变页面内容关闭页签时触发:

window.onbeforeunload=function () {
  return '离开此网站';
};

定时步骤条

test(){
  for(let i=0;i<=3;i++){
    i++;
    if(i===1){
      setTimeout(() => {
        this.setState({
          current:1
        })
      }, 2000);
    }else if(i===2){
      setTimeout(() => {
        this.setState({
          current:2
        })
      }, 2000);
    }else if(i===3){
      setTimeout(() => {
        this.setState({
          current:3
        })
      }, 3000);
    }
    
  }

}


DVA

dva是纯碎的数据流

原始的父子组件传值,子组件传值给父组件可以通过回调,父组件向子组件传值可以通过属性传值或方法注入

较之状态流的数据传递方案其优点:

  • 组件化需要耦合部分固定的state,因为它是复用的。
  • 很多属性的操作,其实并不需要改变state,react的state操作是会触发组件的重新渲染的,耗费性能和额外的不必要的刷新。

redux和dva解决的问题

redux或dva :其实只解决了一个问题,就是组件state的订阅,基于这个订阅,它把数据的变化放在中间层去处理。

在基于state的变化时,则会从redux或者dva的这种订阅收益。

  • 中间层的数据处理代码们本身是可复用的
  • 多个被订阅的页面可以复用数据处理逻辑
  • 跨组件更新时作为一个轮子

Dva数据流

View层操作 –> 触发models层effect中方法 –> 触发service层请求,获取后台数据 –> 触发model层处理相应数据的方法,存储至reducer中 –> 更新model层中state –> 触发view层的render方法进行重新渲染 –> 页面更新

UMI

这块内容是为了给自己看的,和官网一样,大家可以去官网看。

umijs.org/

umi 可以简单地理解为:roadhog + 路由 + HTML 生成 + 完善的插件机制

roadhog:基于 webpack 的封装的cli工具,提供 serverbuildtest 三个命令,分别用于本地调试和构建,并且提供了特别易用的 mock 功能

特点:

  • 开箱即用,内置react,react-router等
  • 开发启动快,支持一键开启 dll
  • dll: 通过 webpack 的 dll 插件预打包一份 dll 文件来达到二次启动提速的目的。
  • 兼容IE9
  • 约定式路由,同时支持可配置路由
  • 完善的插件体系
  • 支持typescript
  • 支持dva数据方案

实现 useActive

利用 Hooks 的 API,可以在组件渲染完毕后利用 useEffect 判断组件是否 Active,并利用 useState 存储这个状态:

export function useActive(domId: string) {
  // 所有元素默认 unActive
  const [active, setActive] = React.useState(false);
  React.useEffect(() => {
    const visibleObserve = new VisibleObserve(domId, "rootId", setActive);
    visibleObserve.observe();
    return () => visibleObserve.unobserve();
  }, [domId]);
  return active;
}


配置config文件

CSS支持字符串

原因是工作中会用到对象引入写法,但是有时候会需要字符串写多个,就可以在config文件中配置以下内容。

export default {
  //配置css支持字符串写法
  cssLoaderOptions:{
    localIdentName:'[local]'
  },

};

支持dva

在 umi@3 中要使用 dva 的功能很简单,只要使用安装 @umijs/plugin-dva 并在 配置文件中开启 `dva` 配置。

yarn add @umijs/plugin-dva

如果提示 dva 不是约定的配置,说明你没有装 @umijs/plugin-dva ,如果你 dva 没有生效,可能是你配置没开启

教程在前面使用 create-umi-app 初始化项目时,依赖了 @umijs/preset-react ,这是一个插件集,你无需再而外安装 plugin-dva ,只需要再配置中开启即可。

打开 umi 的配置文件:config.js

export default {
  singular: true,
  plugins: [
    ['umi-plugin-react', {
      //支持antd使用
      antd: true,
      //支持dva 加入下面依据代码才可会解析model层
      dva: {
        immer: true
      },
      locale: {
        enable: true,
      },
    //打包后名字按照有意义的名字命名 
      dynamicImport: {
          webpackChunkName: true,
        },
    }],
  ],
}


本文章是为了记录工作中小知识点而写,当然,这些问题也许会用到面试当中。

有能帮助到大家的可以收藏,会不定期更新新内容。

欢迎阅读者可多加指点和修正...