意思 | 一边(干/做)… 一边(干/做)… |
用法 | 动词 ます形 去掉 ます + ながら |
例句:
1. 音楽を 聞きながら 勉強します。 聞きます -> 聞きながら 我一边听音乐一边学习。
2. 歌を 歌いながら シャワーを浴びます。歌います -> 歌いながら 我一边唱歌一边洗澡。
意思 | 一边(干/做)… 一边(干/做)… |
用法 | 动词 ます形 去掉 ます + ながら |
例句:
1. 音楽を 聞きながら 勉強します。 聞きます -> 聞きながら 我一边听音乐一边学习。
2. 歌を 歌いながら シャワーを浴びます。歌います -> 歌いながら 我一边唱歌一边洗澡。
意思 | 想(干/做)… |
用法 | 动词 ます形 去掉 ます + たい 肯定 动词 ます形 去掉 ます + たくたい 否定 动词 ます形 去掉 ます + たくありません 否定 |
例句:
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);