按照不同的教学方法,动词分三类或者五类。但其实都是一样的,只是叫法不同。

以辞书形/基本型记:

一类动词(五段动词)二类动词(一段动词)三类动词(サ変动词、カ変动词)
①不以 る 为结尾的动词;词尾在 う段。
②词尾为 る ,倒数第二个假名不在 い段 或 え段。
词尾为 る ,倒数第二个假名为 い段 或 え段。
サ変:する / 词干+する (例:洗濯する、掃除する、勉強する)
カ変:来る
①買う、喜ぶ、行く、飲む、勝つ、倒す
②知る、切る、作る、分かる
見る、食べる、考える、助ける、別れるサ変:する,勉強する
カ変:来る (只有一个)
*注:有些词虽然符合“二类动词”这个规律但仍然为一类动词。比如:見(み)る、起き(おき)る、帰(かえ)る、焦(あせ)る、嘲る(あざける)、 限(かぎ)る、茂(しげ)る、滑(すべ)る、喋(しゃべ)る、入(はい)る等。需要单独记忆。大部分情况:い 或 え的音都发在汉字里了

以ます形/连用形/敬体记

一类动词(五段动词)二类动词(一段动词)三类动词(サ変动词、カ変动词)
ます前面的母音是 い 的音ます前面的母音是 え 的音します・来ます
書きます、のみます、遊びます、撮ります、待ちます、買います、話します教えます、開けます、食べます、寝ます
*置きます、おります、見ます(特殊,需要特别记忆)
サ変:します
カ変:来ます


分类:

い形容词 な形容词
おいしい美味しいにぎやか賑やか
やすい安いげんき元気
さむい寒いきれい綺麗
いいいいゆうめい有名
い形容词+名词 おいしい+パンな形容词+な+名词 にぎやかな街

时态:

 い形容词な形容词い形容词 的 いい
现在おいしいにぎやかですいい
现在否定おいしくないにぎやかじゃないよくない
过去おいしかったにぎやかでしたよかった
过去否定おいしくなかったにぎやかじゃなかったよくなかった
いい 比较特殊,要单独记忆。

提供了操纵多个状态的能力,如果状态是单个的,可以是 useState 的替代。
语法:

const [state, dispatch] = useReducer(reducer, initialState)
const [state, dispatch] = useReducer(reducer, initialState, initFunction) 
// 惰性地创建初始 state, 需要将 init 函数作为 useReducer 的第三个参数传入,这样初始 state 将被设置为 init(initialState)
// 或者
const [state, dispatch] = useReducer(reducer, undefined, initFunction)

示例:

import React, {useReducer, useEffect} from "react";
import ReactDOM from "react-dom";

interface State {
  count: number;
  step: number
}

interface Action {
  type: string;
  payload?: any;
}

const initialState: State = {
  count: 0,
  step: 1,
};

const reducer = (state: State, action: Action) => {
  const {count, step} = state;
  if (action.type === 'tick') {
    return {count: count + step, step};
  } else if (action.type === 'step') {
    return {count, step: action.payload};
  } else {
    throw new Error();
  }
}

const Counter = () => {
  const [state, dispatch] = useReducer(reducer, initialState);
  const {count, step} = state;

  useEffect(() => {
    const id = setInterval(() => {
      dispatch({type: 'tick'});
    }, 1000);
    return () => clearInterval(id);
  }, [dispatch]);

  return (
    <div style={{
      width: '200px',
      margin: '100px auto 0 auto',
      textAlign: 'center',
      border: '1px solid #DDD',
      borderRadius: '4px',
    }}>
      <h1 style={{margin: '10px 0'}}>
        {count}
      </h1>
      <input
        style={{
          marginBottom: '10px',
          border: '1px solid #DDD',
          height: '32px',
          lineHeight: '32px',
          borderRadius: '4px',
        }}
        value={step}
        onChange={e => {
          dispatch({
            type: 'step',
            payload: Number(e.target.value)
          });
        }}
      />
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<Counter/>, rootElement);

dependencies
顾名思义,就是依赖,但是这个依赖只在产品环境(–production)使用安装。
npm install 的时候会默认安装。

devDependencies
开发依赖, npm install 也会安装,但是 npm install –production 时 不会安装这个依赖。

例如:
project dependency 依赖如下:
dependencies: {
 ”a”: ‘0.0.1’,
 ”b”: ”0.0.2
},
devDependencies: {
 ”c”: “0.0.3”
},
npm install 会将 a b c 三个包都安装。而
npm install –production 只会安装 a b 两个包。
假如:
包 a 依赖两个包 x y;
dependencies: {
 ”x”: ‘0.0.1’
},
devDependencies: {
 ”y”: “0.0.2”
},
那么在项目 project dependency 中 npm install 会将 x 这个包安装,而 y 这个包不会安装。因为 依赖 a,但是不没有要开发 a,依赖的应该是 a 的产物才对。

peerDependencies
假设:
project dependency 依赖 的 b 包,但是 b 包并没有 dependencies 而有一个 peerDependencies。
peerDependencies: {
 ”a”: “0.0.1”
},
对于 b 包来说,host(宿主) 是 project dependency,那么一般使用 b 包的时候,几乎可以肯定的是会使用 a 包,所以 a 此时就可以是 b 的一个 peerDependencies。
即:在使用 b 包的时候,几乎可以肯定的是要使用 a 包。所以 b 包没有 dependencies 而有 peerDependencies。
此时 npm install project dependency 的依赖时,就将 b 包 的依赖也装上了,所以不需要显式的声明 b 包 的 dependencies 了。
不过如果 b 包 的 peerDependencies 和 宿主的依赖版本不同的时候,可能会出问题,所以此时最好将两个版本统一。例如 project dependency 依赖的 a 包,和 b 包 peerDependencies 依赖的 a 包。