意思想(干/做)…
用法动词 ます形 去掉 ます + たい      肯定
动词 ます形 去掉 ます + たくたい    否定
动词 ます形 去掉 ます + たくありません 否定

例句:
1. にほんへ 行きたい です。 行きます -> 行きたい 我想去日本。
2. ご飯を 食べたくない です。 食べます -> 食べたくない 我不想吃饭。 
3. 今日どこへも 行きたくありません。 行きます -> 行きたくありません 今天哪里也不想去。

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

以辞书形/基本型记:

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

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

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


分类:

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

时态:

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

提供了操纵多个状态的能力,如果状态是单个的,可以是 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);