文章内容:
-
- 如何引入React
-
- 函数的本质——延迟执行
-
- JSX的用法
-
- 条件判断与循环
一、如何引入React
cdn引入
这种引入比较麻烦
Copy:
Run:
A.cdn需要引入两个链接,
- 一个是umd/react.development.js
- 另一个是umd/react-dom.development.js 运行可以用parcel来运行
B.检查引入是否成功
console.log(window.React)
console.log(window.React.createElement)
console.log(window.ReactDOM)
console.log(window.ReactDOM.render)
这四个对象能在控制台被正常打印出,才说明引入成功。
- 说明: umd是模块规范,还有个是cjs。模块规范:声明如何写一个js的。优先使用umd
Modify:
bug:
- ①codesanbox使用失败,几个都无法打印出
- 使用的时候codesanbox不是自动保存,要先保存后再使用
- react-dom的使用,是window.ReactDOM,后面dom三个字母都是大写
- ②jsbin中不知道如何引入react-dom
- react-dom的使用,是window.ReactDOM,后面dom三个字母都是大写
- ③尽可能用官网提供的cdn吧,最近bootcdn不好用
webpack引入React
- yarn add react react-dom
- import React from 'react'
- import ReactDom from 'react-dom'
React引入对比
- 新手使用create-react-app
- 老手自己配置使用webpack/rollup
create react app引入React
Copy:
facebook/create-react-app: Set up a modern web app by running one command. (github.com)
Run:
- yarn global add create-react-app //安装
- cd <安装的目录>
- create-react-app react-demo //新建react目录
- cd ./react-demo
- yarn start //运行react
- 然后就可以vscode运行这个目录了
- import React from 'react'
bug:
- 新建react目录报错,命令换成
yarn create react-app react-demo-1 - 换命令后还是报错,于是将bash换成cmd运行新建项目命令,然后
yarn start .成功启动
二、初步使用React
用react实现+1
前置知识:
- 对createElement的使用
- 对render将新增节点渲染进渲染界面的理解
- createElement与页面渲染
-
对createElement的使用 createElement会创建一个Dom节点,这个函数的参数了解,第一个写'标签名',然后写{标签属性},然后写[内容值]就行了。
-
对render渲染界面的理解 通过createElement创建的对象为虚拟DOM对象,createElement后的节点不在页面中,通过render将其插入页面的Dom中,这个函数的参数,前面写create的子节点,后面写根节点。
-
createElement与页面渲染 react和vue不同,vue会帮你监听元素,但是react的渲染后就结束了,不管你内部元素的变化了。
react初体验
<div id="root"></div>
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="src/index.js"></script>
然后使用react来写js
const React = window.React
const ReactDOM = window.ReactDOM
const root = document.querySelector('#root')
let n=0
const App = React.createElement('div',{className:'red'},[
n,
React.createElement('button',{
onClick : ()=>{
n += 1
}
},"+1")
])
ReactDOM.render(App,root)
浅写下css
.red{
color : red;
}
react的监听与刷新
graph TD
点击发现n的值并未改变 --> click后数据中的n是否变化n变化后是否被监听到 --> 没有监听到则需要添加监听改变一次就需要重新渲染一次 --> n添加监听页面的n还是没有改变 --> 刷新页面储存的n
运行会发现,n的值还是0,所以,数据中的n变了吗?
如果n变了,但是页面没有显示出变化,就是说render只读取初次n值0。
在onClick中添加console.log(n)后试验发现,打印出的n值是变化的。
那就在n变化后render重新渲染。在n+=1后渲染页面加上ReactDOM.render(App,root)
发现还是没有用,render只认第一次读取到了n值就给它固定了,于是把createElement写出函数调用的形式。这里不理解可以通过let+setTimeout辅助理解
const React = window.React
const ReactDOM = window.ReactDOM
const root = document.querySelector('#root')
let n=0
const App =()=> //为了刷新数据
React.createElement('div',{className:'red'},[
n,
React.createElement('button',{
onClick : ()=>{
n += 1;
ReactDOM.render(App(),root) //为了增加对n的监听
}
},"+1")
])
ReactDOM.render(App(),root)
三、函数与延迟执行
通过React使用时需要添加监听和手动写函数刷新,此时,我们应该思考一下函数的本质。
学习Vue只需要对着文档学习语法就行了,但是学习React需要对js有深入的了解。
比较普通变量与函数
let a =2
let b = a+2
console.log('1',b)
fn=()=>{b = a+2}
a=4
fn()
console.log('2',b)
也就是函数并不会立即执行,只有等到调用的时候才执行,调用的时候才开始读取a的值,所以我们刷新页面的n的值的时候,可以把App写成函数。
const App = ……
const App =()=> //为了刷新数据 ……
React会对比两个不同的虚拟DOM的element,然后局部刷新页面。
React和Vue是两种不同的编程模型。
bug:
在返回的React对象用{}包起来了。就是错误写法如下:
const App = ()=> {React.createElement}
正确写法为:
const App = ()=> React.createElement
四、JSX的用法
前置知识:
JSX是啥?
X表示扩展,JSX就是JS的扩展版。
对比:
Vue有vue-loader React有jsx
实际上jsx被babel-loader代替了,并且Babel-loader被webpack内置
JSX的作用:
- 将XML转义成React.createElment
- 使用{}插入js语法
- create-react-app默认将js当作jsx处理
- 条件判断和循环要用原生的js实现
1. cdn引入jsx
Copy:
在网站中添加 React – React (reactjs.org)
Run:
<body>
<div id="app"></div>
<script src="https://unpkg.com/react@18/umd/react.production.min.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"
crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script src="src/index.js"></script>
<script type='text/babel'>
let n =0
const App = ()=>{
<div>
{n}
<button className='red' (onClick=()=>{
n+=1,
render()
}>
+1
</button>
</div>}
render=()=>{
ReactDOM.render(<App/>,document.querySelector('#app'))
}
render()
</script>
</body>
Modify:
- cdn引入React、ReactDOM和JSX
- 在html中写
<script type='text/babel'></script> - 而babel中的语法,React.createElement直接写一个匿名函数,然后render的时候写
<App/> - class用className代替,变量用{},return后接()
2. webpack+babel-loader
新手可以直接跳过
3. 使用create-react-app
A.新建react项目
- yarn global add create-react-app
- create-react-app <项目名>
- yarn start
B.用vscode打开使用,此时webpack内置了Babel-loader
五、条件判断与循环控制
在JSX中如何使用if-else
对比:
- 在Vue中必须根据Vue提供的语法来写
- 但是在React中按照js语法,你想怎么写就怎么写
Vue中的条件判断
<template>
<div v-if='n%2===0'>n是偶数</div>
<div v-else>n是奇数</div>
</template>
Reaxt JSX中的条件判断
import React from 'react'
const Component = ()=>{
return (
<div>
{n%2===0 ? <div>n是偶数</div> : <div>n是奇数</div>}
</div>
)
}
export default Component
Vue中写循环语句 Vue中可以遍历数组和对象
<template>
<div v-for='(n,index) in arr'> :key='index'
值{{n}},对应的下标为{{index}}
</div>
</template>
在React中
const Component = (props)=>{
return (props.numbers.map((n,index)=>{
return (
<div>值{n},对应的下标为{index}</div>
)}
)
)
}