【周りに流されるな！😱】人気なReactよりも初心者にVueがおすすめな理由 4選 🐳

# 1. はじめに :writing_hand:
フロントエンドのJavaScriptフレームワークは，`React`, `Vue`, `Angular`, `jQuery`など様々ありますが, 今現在(2023/07/18)においては, `React`と`Vue`が人気を占めています．

しかし，Reactは学習コストが高く，フロントエンド初心者には挫折してしまう原因になりかねません(筆者も一度Reactで挫折しました:sob:)．そのため，この記事では**初心者になぜVueがおすすめかということを，Reactと比較しながら**述べていきたいと思います！:clap:

## 1-1. 比較する対象について
```plaintext
==== React =====
 React 17.0.1
==== Vue ====
 Vue 3.3.4
```
今回比較していくのは以下2つです
- Reactは人気が上昇した大きな要因である，**関数コンポーネント**
- Vueは 一番書きやすいとされる，**Options API**
    - (Composition APIは賛否両論あるので今回は無視します)


# 2. Vueがおすすめな理由 4選🐳

## 2-1. どこに書けばいいのかが決まっている
Vueの魅力はやはり，Object形式で書けるところでしょう.
Object形式で書けるということは，Keyを見ればそのValueが何のためにあるのかがわかるということです．
#### React
以下のコードをご覧ください
```jsx
const App = () => {
//State管理，メソッドなどなんでもここに書ける
  const [num, setNum] = useState(0);
  const onClickButton = () => {
    setNum(num + 1);
  };
//ここでHTML形式を返り値で返す
  return (
    <div className="App">
      <p>{ num }</p>
      <button onClick={ onClickButton }>+1</button>
    </div>
  );
};
```
このように場所が決まっているのはHTMLを返り値で返すということだけで，その他は基本的には関数内ならどこに書いてもいいという風になっています．


どこに書いてもいいというのは上級者はうれしいかもしれませんが，初心者にとっては混乱してしまう要因になりえます:cold_sweat:

#### Vue
以下のコードをご覧ください
```vue
<template>
    <div>{{ num }}</div>
    <button v-on:click="onClickButton">+1</button>
</template>
<script>
export defualt {
    data() {
        return {
            //ここにStateを記述
            num: 0,
        }
    },
    methods: {
        //ここにメソッドを記述
        onClickButton() {
            this.num ++;
        }
    }
}
</script>
```
このようにどこに何を記述すればいいかが決まっています！:smile:
`data`の中には状態を記述，`methods`の中にはメソッドを記述などと，フレームワークがあらかじめ決めてくれているので，役割さえ知っていれば混乱しにくくなっています！

## 2-2. 再描画(再レンダリング)を気にしなくていい
フロントエンド開発において，一番意識しなければいけないことは再描画(レンダリング)のタイミングです！
つまり，画面が書き換わるタイミングがとても重要なのです！
ここに対しては，結構な違いがありますが，Vueの方が気にしなくていいような仕様になっています！
#### React
Reactが再レンダリングされるタイミングは大きく分けて以下の3つの時になります
- stateが更新
- propsが更新
- 親コンポーネントが再レンダリングされたとき

ここで注意していただきたいのは<font color="Red">子孫コンポーネントすべて</font>再レンダリングされてしまうという点です:cold_sweat:
つまり思わぬタイミングでの再描画が発生してしまい，重くなってしまう可能性があります...:sob:
この対策としてわざわざ，<font color="blue">メモ化</font>や<font color="Blue">副作用を調節</font>していく必要があります．

###### (追記: 2023/07/18)
Reactも最新のver.18にて再描画方法に改善があったそうです．
少し差が縮まったのかもしれませんね

#### Vue
Vueが再レンダリングされるタイミングは
- 監視対象の変数が変更
  - `data`や`computed`など
- propsが更新

一見同じように見えますが，Vueは **変更が影響を及ぼす部分だけ**が再描画されるようになっており，再レンダリングの必要のない子コンポーネントなどは再レンダリングされないようになっています！:raised_hands:
これはVueがコンポーネントの依存関係をトラッキングしてくれているからです！
紛らわしくなくていいと思いませんか？ :eyes:

## 2-3. ドキュメントが読みやすい
これは正直好みにはなりますが，個人的にはReactの公式ドキュメントはやや直訳チックに感じます．
それと比べると，Vueの公式ドキュメントは自然な日本語となっており，日本人にとってまだ読みやすいものになっています．
以下の項目において見比べてみても，少しReactが不自然になっています．(謎に高圧的ですよね:joy:)
#### React
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2550660/fc102aff-6838-ca17-c1b4-e110650bbca2.png)

#### Vue
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2550660/361afb65-06aa-f74c-a010-fa940afad7f5.png)


## 2-4. CSSが書きやすい
これは **The Vue!!** という感じの特徴になります！
比べてみましょう！
#### React
ReactでのCSSによるデザインは長年議論がなされており，最適解は見つかってない状況です．
ライブラリ等によって変わってきますが，デフォルトでは通常のHTMLファイルのように，CSSファイルを外部に書いてインポートする方法や，オブジェクト形式で記述する方式があります．
```css: App.css
#外部ファイルとして記述する方法
.green {
    background-color: green;
}
```

```jsx: App.jsx
const App = () => {
  const blue = {
    backgroundColor: blue,
  };
  return (
    <>
      <div className="green">green</div>
      <div style={blue}>blue</div>
    </>
  );
};
```
このように,外部ファイルから普通のCSSをインポートして使うか，JSファイル内に記述してオブジェクト形式にするかがデフォルトでは主流のやり方になっています．
方法がたくさんあって初心者は混乱しますし，JSファイル内に記述した場合，`background-color`ではなく`backgroundColor`とキャメルケースしなければならないので，より混乱の要因になります．

#### Vue
まず，必ず1ファイルに収めることができます！
`.vue`ファイルにそのまま`<style></style>`タグに **通常の書き方で**CSSを記述することができます！
```vue
<template>
  <div class="red">red</div>
</template>
<style>
.red {
  background-color: red;
}
</style>
```
さらに，styleタグに`scoped`の属性を付けることで，子や親のコンポーネントに影響を及ぼさずにCSSもかけるため，書きやすさで言えばダントツでいいです！:relaxed:



# 3. まとめ:grin:
いかがだったでしょうか？
本記事では初心者にとってVueがおすすめな理由を述べてきました．
もちろん，フレームワークなので状況に応じて適切なものを利用していく必要があります．
フロントエンドに慣れたら，Vueの次にReactに挑戦してみてはいかがでしょうか？
最後までご覧いただきありがとうございました！🙌

## 参考
[【React】再レンダリングの仕組みと最適化](https://zenn.dev/b1essk/articles/react-re-rendering#2.-props%E3%81%8C%E6%9B%B4%E6%96%B0%E3%81%95%E3%82%8C%E3%81%9F%E6%99%82)
[Reactにおける「副作用」とは？](https://qiita.com/Mitsuw0/items/801f783ca74b062c1ed8)
[Vue.js公式ドキュメント: 他のフレームワークとの比較](https://v2.ja.vuejs.org/v2/guide/comparison#%E5%AE%9F%E8%A1%8C%E6%99%82%E6%80%A7%E8%83%BD)

# 追記