挑战重新开始的React时代
重新挑战令和时代的React。
首先
在过去的文章中我写了一些关于Vue的内容,但实际上在开始学习SPA时,由于挑战React时遇到了一些困难,所以我选择了用Vue进行学习。
这次是因为令和时代的到来,所以我想再次尝试一下React。
我打算写给以下的方向。
-
- Reactの初学者
-
- javascriptは書いたことがある
- webアプリを作りたい
首先,什么是React?
当查看React的官方网站时,可以看到以下的表述:
“为构建用户界面的JavaScript库”
我们考虑将在浏览器上显示的内容分解为组件,提供一种非常便捷的开发体系来实现这些组件。这个库也可以被视为一种更注重用户界面的开发思路。
启动 React
我希望您在PC上安装npm或yarn命令才能启动React。
这次我将使用yarn作为工具。
使用以下命令将创建名为react-test的目录,该目录包含一整套的文件。
yarn create react-app react-test
输入这个命令会创建许多文件。让我们先试着运行一下。试试启动dev服务器。
yarn run start
假如这样做,我认为会出现这样的画面。这样就可以在浏览器中确认使用React编写的程序了。我们将从这里开始。

更简洁的文件结构
為了不讓自己在這次學習React時感到挫折,我打算在這裡刪除大部分的文件,並讓它更簡單地運作。
另外,由于使用常规的Node进行开发时,package.json,yarn.lock以及node_modules没有太大区别,我想忽略它们。这里的目标是src和public文件夹中的文件。为了创建最小的组件,暂时删除其他文件和样式表,并创建一个组件专用的文件夹。
cd src
rm App.css App.test.js index.css logo.svg reportWebVitals.js setupTests.js
mkdir components
以下是一种简洁的中文表达方式:“我想制作的是这次。”
组件 -> index.js
只需要这样就足够了。
因为在这里我们将以jsx格式而不是js格式编写代码,所以要改变文件扩展名。基础是App.js,并最终将删除App.js。
cp App.js components/Greeting.jsx
cp App.js components/Introduce.jsx
cp App.js components/Coin.jsx
rm App.js
我认为到这里以下将会形成目录结构。
pwd
/react-test/src
tree .
.
├── components
│ ├── Coin.jsx
│ ├── Greeting.jsx
│ └── Introduce.jsx
└── index.js
1 directory, 4 files
我想做的是,在components文件夹下创建上述的三个组件,并在index.js将这些文件加载到html文件中进行呈现。
JSX的解释
这是一个非常简单的东西,但它允许在JavaScript中编写HTML格式。这是React官方JSX的解释。
从这些中选择摘录以下内容
const element = <h1>Hello, world!</h1>;
これは JSX と呼ばれる JavaScript の構文の拡張です。
UI がどのような見た目かを記述するために、React とともに JSX を使用することを私たちはお勧めしています。
JSX はテンプレート言語を連想させるでしょうが、JavaScript の機能を全て備えたものです。
JSX は React “要素” を生成します。
次の章で React 要素を DOM に変換する方法について見ていきます。
以下では、JSX を使い始めるのに必要な基礎を学ぶことができます。
以下是一种将html的值赋给js变量的写法,而这种写法是由jsx的特点允许的。
创建一个问候组件
将index.js文件按照以下方式修改。
import React from 'react';
import ReactDOM from 'react-dom/client';
import { Greeting } from './components/Greeting.jsx';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Greeting />
</React.StrictMode>
);
我們將開始製作組件。
import React from 'react';
export const Greeting = () => {
const greet = 'Hello, world';
return(
<h1>{ greet }</h1>
);
}
如果你通过访问 http://localhost:3000 ,并且看到了以下的情况,那就表示成功了。

创建一个名为Greeting的组件,并通过index.js渲染到HTML中(实际上,通过阅读index.js的代码,我们可以看到它首先获取根元素的id,然后将组件渲染到那个地方)。
关于Greeting.jsx的代码进行解释说明
当我早先尝试使用react时,我记得是以类的形式编写的,但现在似乎也有这种函数组件的写法。我希望在这里使用这种写法。请将文件扩展名保存为jsx。
回应:函数组件和类组件之间的区别。
通过把它作为一个函数来编写,我觉得它与Vue等写法相比更直观和简洁。在这段代码中,我们使用了箭头函数。基于JavaScript的基础上,我们使用const等变量声明,并利用jsx的特权在返回值中返回了HTML。
创建Introduce组件。
通过使用基本的React来创建组件,我们可以使用Greeting组件进行。下一步是尝试传递值的props。这也是Vue中的一个机制,简单来说,就是从调用父组件向子组件传递值,并将该值反映到显示中。
我将编辑index.js。我已经添加了对Introduce.jsx的引入。
import React from 'react';
import ReactDOM from 'react-dom/client';
import { Greeting } from './components/Greeting.jsx';
import { Introduce } from './components/Introduce.jsx';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Introduce name="qiita" age="20" />
<Greeting />
</React.StrictMode>
);
我将编辑Introduce.jsx。
import React from 'react';
export const Introduce = props => {
return(
<h1>I am {props.name}, {props.age} years old </h1>
);
}
如果在这里重新在浏览器中显示,将会如下所示。

我们可以通过父组件向子组件传递Props属性来获取值。
//---------------------------------------------------------------------//
//渡す側 index.js (親コンポーネント内)
<Introduce name="qiita" age="20" />
//---------------------------------------------------------------------//
//受け取る側 Introduce.jsx (子コンポーネント内)
export const Introduce = props => {
return(
<h1>I am {props.name}, {props.age} years old </h1>
);
}
//---------------------------------------------------------------------//
创建Coin组件
,我們接下來要嘗試使用 React Hooks。我找到了一個非常易懂的網站,我們將以該網站為基礎進行解釋。
首先从组件开始。我们进一步简化了上述网站的测试代码。为了将State作为函数处理,我们使用了Hooks。
import React, { useState } from 'react';
export const Coin = () => {
// isVisible:stateを宣言する。
// setVisibility:stateを更新する関数を宣言する。
// useStateの引数はisVisibleの初期値を指定する。
const [isVisible, setVisibility] = useState(true);
// isVisibleを反転する関数を定義する。
const updateVisibility = () => {
setVisibility(!isVisible);
};
return(
<React.Fragment>
<button onClick={updateVisibility}>
反転ボタン
</button>
<div>
{isVisible
?
<div>
<p>オモテです</p>
</div>
:
<div>
<p>ウラです</p>
</div>
}
</div>
</React.Fragment>
);
}
在组件中执行以下处理。
-
- stateを宣言する。
-
- stateを更新する関数を宣言する。
-
- useStateの引数はisVisibleの初期値を指定する。
-
- stateを更新する関数をラップする関数を作成する。
- 実際に呼び出す(今回はボタンアクションonClickに対して上のラッパー関数を呼び出しています)
另外,在返回多个元素时,使用了覆盖return的方式。
当更改硬币的正反面时,会进行判定并改变显示内容,这是通过if语句来实现的。
{isVisible
?
<div>
<p>オモテです</p>
</div>
:
<div>
<p>ウラです</p>
</div>
}
コンポーネントの作成が終わったので、index.jsでCoin.jsxを読み込むように編集します。
import React from 'react';
import ReactDOM from 'react-dom/client';
import { Greeting } from './components/Greeting.jsx';
import { Introduce } from './components/Introduce.jsx';
import { Coin } from './components/Coin.jsx';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Introduce name="taro" age="10" />
<Greeting />
<Coin />
</React.StrictMode>
);
在这之前,我们已经写好了代码并进行了浏览器确认,接下来会以以下方式显示。当按下翻转按钮时,正面和背面将会反转。

最后
这次我们创建了一个非常简单的React应用程序。通过使用简单的文件结构,我认为可以顺利学习React的核心部分而无需感到沮丧。
我们考虑在接下来的文章中继续推进以下内容。
-
- Hooksの他の関数
-
- Contextの利用
-
- プロジェクトのTypeScript化/CSS
- Reduxの利用