React
一:React介绍
网址:https://zh-hans.reactjs.org/
再也看不到操作节点的操作
1.特点
-
自动化的UI状态管理
-
虚拟DOM
用普通js对象来描述DOM结构,因为不是真实DOM,所以称之为虚拟DOM。(通过虚拟DOM来改变节点,把改变后的虚拟DOM和真实DOM比较,然后更新节点)
好处:简化了DOM操作,提高了性能
-
组件化开发
组件化和模块化的共同点:都可以复用
区别:组件化:根据不同的功能,不同的标签划分成不同的组件;模块化:是实现代码的管理,把一个页面分为多个模块;
组件化:不同的标签划分成不同的组件,然后把所有组件组合在一起(结构,样式和行为)(一般要将组件化和模块化一起用,因为有了模块化才能更好的实现组件化),组件化就是把各个功能组件化,各自有各自的结构,样式和行为,用的时候可以直接调用这个组件
-
完全在Javascript中定义UI
-
JSX
1.里面可以使用html标签
-
只是MVC架构中的v
模型 视图 控制
-
单向数据流
数据传递只有一个方向(父组件—>子组件),能追寻都溯源
why:如果把他设置为双向传递,性能会变低,而且追寻溯源比较困难
二:使用方法
createElwment("标签名","属性","标签的内容")
方法1:直接写入
-
引入在线的React插件
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
-
案例
//书写方式1:直接写 ReactDOM.render(React.createElement("h1", { title: "hello" }, "hello word"), document.getElementById("root"));
方法2:组合方式写
//书写方式2:组合方式写
let HElement = React.createElement("h1", { title: "hello" }, "hello word");
let pElement = React.createElement("p", null, "段落1");
let RootElement = React.createElement("div", null,HElement,pElement);
ReactDOM.render(RootElement, document.getElementById("root"));
方法3:JSX语法
JSX是技术内定义的一套XML语法,语序在JS内像编译HTML代码一样的编写组件,最终都会被相应的工具编译成Javascript
React官方推荐使用JSX来编写组件
1.规范
-
组件可以嵌套组件;
-
组件可以当作标签来使用;
-
JSX规则和XML一样
-
标签必须染个闭合
<RootElement />
-
属性
-
大部分属性和html标签一致
-
两个特殊:for=>htmlFor;class->className
<label htmlFor="p1">内容</label> <p className="p1" id="p1">段落1</p>
-
可以自定义属性
-
-
花括号
{}
- 如果引用变量必须使用花括号
- 里面能进行运算,但是不能使用条件语句和循环语句
-
注释
{/**/}
2.用法
-
引入JSX的babel
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
-
案例
注意:1.在写script的时候,记得加
type="text/babel"
2.
return
后面不能换行跟东西,不然会报错,如果偏要换行,就要要换行的时候加上一个()
3.
{}
3.1:引用变量的语法,不能在外面加入""
;3.2:里面能进行运算,但是不能使用条件语句和循环语句<script type="text/babel"> let H1Element = function(){ return <h1>hello React</h1> } let PElement = function(){ return <div> <label htmlFor="p1">内容</label> <p className="p1" id="p1">段落1</p> </div> } let RootElement = function(){ return <div> <H1Element></H1Element> <PElement></PElement> </div> } ReactDOM.render(<RootElement />,document.getElementById("root")); </script>
3.循环
通过数组来进行循环
{}
1.引用变量的语法,不能在外面加入""
;2:里面能进行运算,能调用方法,但是不能使用条件语句和循环语还有判断语句
let H1Element = function(){
return <h1>hello React</h1>
}
let PElement = function(){
let Pcontent = "我是段落1";
let className = "p1"
return <div>
<label htmlFor="p1">内容</label>
<p className={className} id="p1">{Pcontent}</p>
</div>
}
let RootElement = function(){
let arr = [1,2,3,4,5,6];
//用Array创建一个数组,你需要多少个的时候,你就写多少,在里面在填充为0的数字(因为反正数字在里面都没啥用)
let ary = new Array(10).fill(0);
return <div>
<H1Element></H1Element>
{ary.map(()=><PElement></PElement>)}
</div>
}
ReactDOM.render(<RootElement />,document.getElementById("root"));
4.JSX中的注释
{/*注释*/}
function render(){
return <p>
{/*这是注释内容*/}
</p>
}
三:React中的组件
概念:组件是编写React应用的基础,一个应用就是由大大小小的组件组合而成
组件分类:
-
无状态组件-普通函数定义,无状态,没有生命周期,能过够优化性能
function Top() { return <div></div> }
let PElement = function(){ let Pcontent = "我是段落1"; let className = "p1" return <div> <label htmlFor="p1">内容</label> <p className={className} id="p1">{Pcontent}</p> </div> }
-
有状态组件:推荐ES6语法定义,React内部会创建实例,并拥有完整的生命周期;还有Hook写法
class PElement extends React.Component { render() { return <div></div> } }
class PElement extends React.Component { render() { let Pcontent = "我是段落1"; let className = "p1" return <div> <label htmlFor="p1">内容</label> <p className={className} id="p1">{Pcontent}</p> </div> } }
四:组件的规范
- 每一个组件必须有返回值,如果返回值又是一个组件则必须有且仅有一个根元素
- 如果返回null或false,编译时会被替换为
<noscript>
五:组件的传参
1.在由组件组成的应用中,组件之间的关系主要是父与子,类似于HTML标签
2.数据可以在组件之间传递,不过只能是单向,由父传递给子组件
3.用到的对象
props
(1):通过自定义属性传递(2):通过文本内容传递-children
只能单向传递数据流(父组件传递子组件):数字,对象,样式
-
无状态逐渐传参
能传属性值,父组件可以自定义名字传递给子组件
props.属性名
<h1 title={props.myTitle}>hello React</h1>
传递标签里面的内容用
props.children
<p className={className} id="p1">{props.children}</p>
let H1Element = function(props){ return <h1 title={props.myTitle}>hello React</h1> } let PElement = function(props){ let className = "p1" return <div> <label htmlFor="p1">内容</label> <p className={className} id="p1">{props.children}</p> </div> } let RootElement = function(){ let arr = ["段落1","段落2","段落3","段落4"]; return <div> <H1Element myTitle="标题1"></H1Element> {arr.map((item)=><PElement>{item}</PElement>)} </div> } ReactDOM.render(<RootElement />,document.getElementById("root"));
-
有状态组件传参(用this)
class H1Element extends React.Component { render(props) { return <h1 title={this.props.mytitle}>hello React</h1> } }
-
设置样式
方法1:
let H1Element = function(props){ return <h1 title={props.myTitle} style={{color:"red",backgroundColor:"yellow"}} >hello React</h1> }
方法2:
let H1Element = function(props){ let style = {color:"red",backgroundColor:"yellow"}; return <h1 title={props.myTitle} style={style} >hello React</h1> }
方法3:单独设置颜色
let PElement = function(props){ let Pcontent = "我是段落1"; let className = "p1"; let style = { color:"red", backgroundColor:"yellow", ...props.style }; return <div> <label htmlFor="p1">内容</label> <p className={className} id="p1" style={style}>{props.children}</p> </div> } let RootElement = function(){ let arr = [ { letter:"段落1", style:{ color:"blue", backgroundColor:"green" }}, { letter:"段落2", style:{ color:"blue", backgroundColor:"skyblue" }}, ] return <div> <H1Element myTitle="标题1"></H1Element> {arr.map((item)=><PElement style={item.style}>{item.letter}</PElement>)} </div> } ReactDOM.render(<RootElement />,document.getElementById("root"));
六:实例,24字母不同背景颜色完成
<body>
<div id="root"></div>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
//卡片
class Card extends React.Component {
render(props) {
function color() {
let r = Math.floor(Math.random() * 256);
let g = Math.floor(Math.random() * 256);
let b = Math.floor(Math.random() * 256);
return "rgb(" + r + "," + g + "," + b + ")";
}
console.log(color());
let style = { color: "black", backgroundColor: color(), width: "50px", height: "50px", textAlign: "center", lineHeight: "50px" };
return <div style={style}>
{this.props.children}
</div>
}
}
//盒子
class Root extends React.Component {
render() {
let ary = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "G", "K","R","M","N","O"];
let style = { width: "270px", height: "270px", display: "flex", justifyContent: "space-around", flexWrap: "wrap", margin: "auto", border: " 1px solid" };
return <div style={style}>
{ary.map((item) => <Card>{item}</Card>)}
</div>
}
}
ReactDOM.render(<Root />, document.getElementById("root"))
</script>
</body>
七:如何划分组件
- 每个组件干的事情不能太多。否则粒度过哒,重用性低
- 粒度过细,导致代码量增加,复杂度增加