April 18, 2020
获取滚动高度 # 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
April 18, 2020
设置npm和yarn使用淘宝仓库,设置sass/electron快速下载地址。
March 31, 2020
介绍AJAX的基本API和作用
July 18, 2019
Git 常用操作,暂存,刷新远程分支列表,取消追踪,代理设置等。
July 8, 2019
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.
...
December 2, 2018
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 的概念需要再了解一下。
...
November 28, 2018
参考: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) { // .
...