这样的好处是不用npm搭建环境,会更加简单方便,但是不利于生态的使用
示例
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello React!</title>
<!-- react.min.js - React 的核心库 -->
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<!-- 提供与 DOM 相关的功能 的核心库 -->
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<!-- Babel 可以将 ES6 代码转为 ES5 代码,这样我们就能在目前不支持 ES6 浏览器上执行 React 代码。Babel 内嵌了对 JSX 的支持 -->
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>
<div id="example"></div>
<!-- 如果需要使用 JSX,则 <script> 标签的 type 属性需要设置为 text/babel -->
<script type="text/babel">
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
// 将一个h1标题插入id 为example 的dom元素中.
</script>
</body>
</html>
$ npm install babel -g
$ npm install webpack -g
$ npm install webpack-dev-server -g
$ mkdir reactApp
$ cd reactApp/
$ npm init
name: (reactApp) youj-react-test
version: (1.0.0)
description: W3Cschool教程 react 测试
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/laolan/www/reactApp/package.json:
{
"name": "youj-react-test",
"version": "1.0.0",
"description": "W3Cschool教程 react 测试",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Is this ok? (yes)
$ npm install react --save
$ npm install react-dom --save
同时我们也要安装一些 babel 插件
$ npm install babel-core
$ npm install babel-loader
$ npm install babel-preset-react
$ npm install babel-preset-es2015
4.第四步、创建文件
创建index.html、App.jsx、main.js、webpack.config.js等文件
var config = {
entry: './main.js',
output: {
path:'./',
filename: 'index.js',
},
devServer: {
inline: true,
port: 7777
},
module: {
loaders: [ {
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel',
query: {
presets: ['es2015', 'react']
}
}]
}
}
module.exports = config;
entry
: 指定打包的入口文件 main.js。
output
:配置打包结果,path定义了输出的文件夹,filename则定义了打包结果文件的名称。
devServer
:设置服务器端口号为 7777,端口后你可以自己设定 。
module
:定义了对模块的处理逻辑,这里可以用loaders定义了一系列的加载器,以及一些正则。当需要加载的文件匹配test的正则时,就会调用后面的loader对文件进行处理,这正是webpack强大的原因。
打开 package.json 文件,找到 "scripts" 中的 “test” "echo “Error: no test specified” && exit 1" 使用以下代码替换:
"start": "webpack-dev-server --hot"
现在我们可以使用 npm start
命令来启动服务。--hot
命令会在文件变化后重新载入,这样就不需要在代码修改后重新刷新浏览器就能看到变化。
<div id = "app">
为我们应用的根元素,并引入 index.js 脚本文件。<!DOCTYPE html>
<html>
<head>
<meta charset = "UTF-8">
<title>React App</title>
</head>
<body>
<div id = "app"></div>
<script src = "index.js"></script>
</body>
</html>
import React from 'react';
class App extends React.Component {
render() {
return (
<div>
Hello World!!!
</div>
);
}
}
export default App;
需要引入组件并将其渲染到根元素 App 上
main.js 文件代码
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.jsx';
ReactDOM.render(<App />, document.getElementById('app'))
首先需要配置好本地的npm命令。就可以使用create-react-app 快速构建 React 开发环境,create-react-app 是来自于 Facebook,通过该命令我们无需配置就能快速构建 React 开发环境,但是此工具要求的node版本为14以上
# 首先安装create-react-app 工具
npm install -g create-react-app
# 使用create-react-app创建了 项目名my-app的react项目
create-react-app my-app
# 在项目目录下执行 start 启动项目
npm start
# 在浏览器中打开 http://localhost:3000/ 就可以访问了
创建的项目目录为:
my-app/
README.md
node_modules/
package.json
.gitignore
public/
favicon.ico
index.html
manifest.json
src/
App.css
App.js
App.test.js
index.css
index.js
logo.svg
manifest.json 指定了开始页面 index.html,一切的开始都从这里开始,所以这个是代码执行的源头
src/App.js就是定义的组件,src/index.js是入口文件,一般就是将app组件挂在到index.html中的dom节点上,一般可以在src/index.js中修改要挂载的节点为自己定义的组件。
react是通过将组件挂载到指定的某个dom节点来进行渲染页面的。
示例:
function ShowTime(props)=>{
return <div>
<h1>Hello, world!</h1>
<h2>现在是 {props.now.toLocaleTimeString()}.</h2>
</div>
}
function moount(){
ReactDOM.render(
<ShowTime now={new Date()} />,
document.getElementById('example')
);
setInterval(moount, 1000);
以上代码就是react的组件挂载, 他是使用ReactDOM.render方法将 定义的funA组件挂载到了 页面中id为example的dom节点上。每次更新组件都会使用diff算法,比较出改变的内容,进行更新组件,react 使用 虚拟dom和diff算法使得页面渲染性能有了极大的提升.
React 使用 JSX 来替代常规的 JavaScript。
JSX(JavaScript Xml) 是一个看起来很像 XML 的 JavaScript 语法扩展。
我们不需要一定使用 JSX,但它有以下优点:
const element = <h1>Hello, world!</h1>;
ReactDOM.render(element,document.getElementById('root');
这种类似HTML的标签语法被称为 JSX,是一种 JavaScript 的语法扩展。 在 React 中推荐使用 JSX 来描述用户界面。
JSX 是在 JavaScript 内部实现的。
元素是构成 React 应用的最小单位,JSX 就是用来声明 React 当中的元素。
React DOM 可以确保 浏览器 DOM 的数据内容与 React 元素保持一致。
要将 React 元素渲染到根 DOM 节点中,通过把它们都传递给 ReactDOM.render() 的方法来将其渲染到页面上.
js表达式要用{ }包裹起来
const str = 'hello ';
const element = <span>{str + 'World!'}</span>
jsx只支持js表达式,不支持js代码,所以不能写if else等语句。 如果要使用条件判断,一般使用三元运算,在react项目中会遇见大量的三元表达式,但是要慎用,如果使用嵌套层级太多的三元运算会使代码不可读,难以维护。
const num = 5;
const expressionElement = <span>{num}{ num%2 === 1 ? '是奇数' : '是偶数' }</span>; // 5是奇数
jsx支持内联样式,style使用 camelCase 语法来设置内联样式. React 会在指定元素数字后自动添加 px ,也可以使用原有的css写法,只不过需要键和值都需要加引号。
const styleElement = <span style={{backgroundColor: 'red',fontSize:'16'}} ></span>;
{/* 传入内联样式需要两层{},第一层表示要放js表达式,第二层表示是一个css对象, */}
{/* 内联对象的属性就是css的样式,只不过之前 '-'连接的属性现在需要转成小驼峰的形式 */}
const styleElement = <span style={{'background-color': 'red','font-size':'16'}} ></span>;
JSX 允许在模板中插入数组,数组会自动展开所有成员:
const domArr = [ <p>java</p>,<p>js</p> ];
const ele = <React.Fragment> {domArr} </React.Fragment>;
ReactDOM.render(ele ,document.getElementById('root');
注意: React 中的一个常见模式是一个组件返回多个元素。Fragments 允许你将子列表分组,而无需向 DOM 添加额外节点。他是处理一个元素,所以如果我们直接传入 一个jsx数组,可能会报错,导致无法渲染,我们就需要一个标签来对数组进行包裹,直接用html标签包裹的话会导致渲染会多一层标签,如果不想包裹的这一层标签渲染,就可以使用
<React.Fragment></React.Fragment>
包裹,在react16.8以后也可以使用<></>
,Fragment标签相比较空标签,可以支持key属性的传入。
JSX 中如何遍历展示数组 , 如果想在vue中想v-for那样遍历数组并自定义展示元素效果,就可以利用js 数组对象的map方法会返回 数组对象,然后利用react 自动展开数组所有成员 的特点来进行展示数组
const data = ['JS','JAVA','C','C++'];
const dataElementArr = <React.Fragment>
{data.map((item,index) => {
return <p>这是第{index+1}行 元素为:{item}</p>
})}
</React.Fragment>
ReactDOM.render(
dataElementArr,
document.getElementById('example')
);