api

获取滚动高度

April 18, 2020
JavaScript
api

获取滚动高度 # 1 2 3 4 5 6 7 8 9 10 11 function getPageScrollY() { let yScroll; if (self.pageYOffset) { yScroll = self.pageYOffset; } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict yScroll = document.documentElement.scrollTop; } else if (document.body) {// all other Explorers yScroll = document.body.scrollTop; } return yScroll; }; 也可以window.scrollY

Npm与yarn

April 18, 2020
前端
api

设置npm和yarn使用淘宝仓库,设置sass/electron快速下载地址。

Git常用操作

July 18, 2019
git
api

Git 常用操作,暂存,刷新远程分支列表,取消追踪,代理设置等。

利用useContext使用ReactRouter

July 8, 2019
React
api

React Router 的history.push # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import React, { useState, useContext, useEffect } from 'react'; import { __RouterContext } from "react-router"; const Login: React.FC = () => { const [token, setToken] = useState(''); const { history } = useContext(__RouterContext); useEffect(() => { if (token) { history.push('/list') } }, [token, history]); return ( <> <button onClick={()=>setToken('666')}>登录</button> </> ); } 这段代码的逻辑是,等级登录按钮,设置token变量。当token变量变化时,触发useEffect调用ReactRouter的history. ...

Redux Saga

December 2, 2018
React
api

redux-saga中使用fetch # 1 2 3 const response = yield call(fetch, '/consult/v1/headCarousel'); const data = yield response.json(); yield put({ type: 'save', payload: data }); 为了对它有一个感性的认识,首先看一下 中文文档 把dome写出来,跑一下。另外还需要了解 ES6的Generator 。 跑完了文档中的dome之后,在来看一个例子。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // 类 thunk 的 worker “进程” function* load() { yield put({ type: BEGIN_LOAD_DATA }); try { const result = yield call(fetch, UrlMap.loadData); yield put({ type: LOAD_DATA_SUCCESS ,payload: result }); } catch (e) { yield put({type: LOAD_DATA_ERROR }); } } function* saga() { // 创建一个监听“进程” yield fork(watch(CLICK_LOAD_BUTTON, load)) } 这里有几个 redux-saga 的概念需要再了解一下。 ...

Redux 概要

November 28, 2018
React
api

参考:Redux 入门教程 基本概念 # store:保存数据的容器,整个应用通常只有一个store。 state:store在某时点的一个快照,一个state对应一个view。 action:定义一个用户对view的操作。 可以暂时这样理解: store生成一个快照state,state对应一个view,view发出action来通知store变化,使store变化而生成一个新的state,新的state又对应新的view。 ActionCreator:通常action只是一个对象,且只有type属性使必须的。我们知道action代表着view的操作,所以action可能有很多个又被经常使用,所以用一个函数来生成各种action是比较合理的操作,这个函数就叫做ActionCreator。 const ADD_TODO = '添加 TODO'; function addTodo(text) { return { type: ADD_TODO, text } } const action = addTodo('Learn Redux'); Redux的API # 生成store、获得state import { createStore } from 'redux'; const store = createStore(fn); const state = store.getState(); view通过store.dispatch() 发出action: store.dispatch({ type: 'ADD_TODO', payload: 'Learn Redux' }); // store.dispatch(addTodo('learn Redux')); store在接收到action时,会根据action生成一个新的state,那么如何生成新的state,这个计算过程怎么定义呢? Reducer # Reducer是一个函数,它定义store在接收到action时state如何发生变化。action只描述发生了什么,而reducer描述state如何变化。这个函数是这样的: const reducer = function (state, action) { // . ...