react(一)
一、react基本概念
React是Facebook开发的一款js库,Facebook认为MVC无法满足他们的拓展需求
1、特点
- 不使用模板
- 不是一个mvc框架
- 响应式(数据更新非常简单)
- 轻量级JS库
2、原理
虚拟DOM -- 抽象成为一个JS对象 -- 生成/替换真实DOM
diff算法
1、虚拟DOM确保对界面上真正发生变化的部分进行实际的DOM操作
2、逐层次的进行节点比较
二、安装
官网地址:https://reactjs.org/
国内使用 npm 速度很慢,推荐使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
$ npm config set registry https://registry.npm.taobao.org
# 这样就可以使用 cnpm 命令来安装模块了
$ cnpm install [name]
三、JSX语法使用
1、资源引入
引用文件:
- react.js 核心文件
- react-dom.js 渲染页面中的DOM 当前文件依赖于react核心文件
- babel.js ES6转ES5,JSX语法转成javascript,方便浏览器进行代码兼容
# 引入资源的路径问题
<script src="node_modules/react/umd/react.development.js"></script>
<script src="node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="node_modules/babel-standalone/babel.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>第一个实例</title>
<script src="node_modules/react/umd/react.development.js"></script>
<script src="node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<!-- 创建一个根节点 一个页面需要一个根节点 这个节点下的内容就会被react管理 -->
<div id="demo1"></div>
<script type="text/babel">
let myDom = <h1>你好</h1>;
ReactDOM.render(myDom,document.getElementById("demo1"));
</script>
</body>
</html>
2、注释
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jsx</title>
<script src="node_modules/react/umd/react.development.js"></script>
<script src="node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1"></div>
<script type="text/babel">
let myDom = <h1>
{/* 我是注释 */}
你好
</h1>;
ReactDOM.render(myDom,document.getElementById("demo1"));
</script>
</body>
</html>
3、多标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hellow React</title>
<script src="node_modules/react/umd/react.development.js"></script>
<script src="node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<!-- 创建一个根节点 一个页面需要一个根节点 这个节点下的内容就会被react管理 -->
<div id="demo2">
</div>
<script type="text/babel">
// 多行标签,需要一个父元素包裹
// 以下方式会多出一个dom节点
// 可用<></> 空标签进行包裹
// 在create-react-app中,还可以用Fragment标签进行包裹,包裹前需要导入Fragment
let myDom = (
<div>
<div>我是第一个内容</div>
<div>我是第二个内容</div>
</div>
);
ReactDOM.render(myDom,document.getElementById("demo2"));
</script>
</body>
</html>
4、表达式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jsx</title>
<script src="node_modules/react/umd/react.development.js"></script>
<script src="node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1"></div>
<script type="text/babel">
// 1.使用表达式 {表达式}
let text = "你好";
let num = 1314;
let user = {
name:"小明",
age:18
};
function fun(obj){
// 方式一:
// return "姓名是:"+obj.name+"--------"+"年龄是:"+obj.age;
// 方式二(ES6模板式):
return `姓名是${obj.name},年龄是${obj.age}`;
}
let myDom = (<div>
<div>{text}</div>
<div>{num}</div>
{/* 2. 算法*/}
<div>{num + 1}</div>
{/* 3. 函数的使用*/}
<div>{fun(user)}</div>
</div>);
ReactDOM.render(myDom,document.getElementById("demo1"));
</script>
</body>
</html>
5、修改样式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jsx</title>
<script src="node_modules/react/umd/react.development.js"></script>
<script src="node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="node_modules/babel-standalone/babel.min.js"></script>
<style>
.demo1Style{
color:red;
}
</style>
</head>
<body>
<div id="demo1"></div>
<script type="text/babel">
// 三元/三目运算符
// let phone = 3900;
// let myDom = (<div>
// 当前手机价值{phone}----{phone>4000 ? '很贵' : '也不便宜'}
// </div>);
// 渲染数组
// var arr = [
// <p>新闻列表1</p>,
// <p>新闻列表2</p>,
// <p>新闻列表3</p>,
// <p>新闻列表4</p>,
// <p>新闻列表5</p>,
// <p>新闻列表6</p>
// ];
// let myDom = (<div>
// {arr}
// </div>);
// 属性设置
// let text = '点我去百度';
// let linkUrl = 'https://www.baidu.com';
// let myDom = <a href={linkUrl} type="_blank">{text}</a>
// 修改样式 backgroundColor不用 - 分割 要用驼峰命名
// let myStyle = {color:"red",backgroundColor:"red"};
// let myDom = <p style={myStyle}>修改样式</p>
// 在jsx中不能用class 这个属性 因为class是js关键字 要用 className 代替.demo1Style在<head>定义
let myDom = <p className="demo1Style">修改样式</p>
ReactDOM.render(myDom,document.getElementById("demo1"));
</script>
</body>
</html>
6、遍历列表
1、JS回顾
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hellow React</title>
<script src="node_modules/react/umd/react.development.js"></script>
<script src="node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<script type="text/babel">
// 1、定义一个对象
var obj = {
name:"小明",
age:18
};
// 打印的两种方式
console.log(obj.name);
console.log(obj["name"])
// 点的方式方便,但如果key是一个变量,就不能用这种方式
console.log(Object.keys(obj));// 返回一个数组类型的数据 返回对象obj的key
console.log(Object.values(obj));// 返回一个数组类型的数据 返回对象obj的value
</script>
</body>
</html>
2、map循环
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hellow React</title>
<script src="node_modules/react/umd/react.development.js"></script>
<script src="node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<!-- 创建一个根节点 一个页面需要一个根节点 这个节点下的内容就会被react管理 -->
<div id="demo1">
</div>
<script type="text/babel">
// 1、react列表渲染 map()
let arr = [
"吃饭","睡觉","打豆豆"
];
// 不加Key,页面控制台会报错。key必须独一无二
// return () 避免换行引起的错误
let myDom = arr.map((item,index)=>{
return (<p key={index}>{item}</p>)
});
ReactDOM.render(myDom,document.getElementById("demo1"));
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jsx</title>
<script src="node_modules/react/umd/react.development.js"></script>
<script src="node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="node_modules/babel-standalone/babel.min.js"></script>
<style>
.demo1Style{
color:red;
}
</style>
</head>
<body>
<div id="demo1"></div>
<script type="text/babel">
let obj = {
name:"xixi",age:18,sex: '男'
};
let myDom = (<div>
{
Object.keys(obj).map((v,i)=>{
return (<p key={i}>便利的属性是{v}----便利出来的值是{obj[v]}</p>)
})
}
</div>);
ReactDOM.render(myDom,document.getElementById("demo1"));
</script>
</body>
</html>
3、for...in
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hellow React</title>
<script src="node_modules/react/umd/react.development.js"></script>
<script src="node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
let arr = [
"吃饭","睡觉","打豆豆"
];
function fun(){
let newArr = [];
// 2、for...in 循环
for(let index in arr){
newArr.push(<p key={index}>{arr[index]}</p>)
}
return newArr;
}
ReactDOM.render(fun(),document.getElementById("demo1"));
</script>
</body>
</html>
4、示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hellow React</title>
<script src="node_modules/react/umd/react.development.js"></script>
<script src="node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
// 1、定义数组
let arr = [
"吃饭","睡觉","打豆豆"
];
// 定义与key对应的初始值
let index = -1;
function fun(){
let myDom = arr.map((v,i)=>{
return (<p style={{color:i==index?'red':''}} key={i} onClick={()=>{index=i;console.log({i});render()}}>{v}</p>)
});
return myDom;
}
function render(){
// 渲染后不会变,需要封装成方法,方便重新渲染
ReactDOM.render(fun(),document.getElementById("demo1"));
}
render();
</script>
</body>
</html>
四、组件
1、高耦合低内聚
高耦合就是把逻辑紧密的内容放在一个组件当中
低内聚把不同组件的依赖关系尽量弱化,每个组件尽可能的独立起来
2、组件的重要内容
1、构建方式
2、组件的属性
3、声明周期
3、演变过程
传统组件明显特点:
- 简单的封装
- 简单的声明周期的呈现
- 明显的数据流动
- 项目复杂时,项目结构样式和行为,很难维护
react组件:
- 属性:props
- 状态:state
- 生命周期
4、实现
通过组件可以把页面的ui部分切分成独立、高复用的部件。使开发者更专注于一个个独立的部件。
5、组件与组件化
组件:实现页面局部功能的代码集合,简化页面的复杂程度,提高运行效率
组件化:当前程序都是使用组件完成的,体现了组件化的应用
6、创建
1、函数组件/无状态组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
// 父子组件
function MyComA(){
return (
<div>我是第1个</div>
)
}
function MyComB(){
return (
<div>我是第2个</div>
)
}
function MyComC(){
return (
<div>我是第3个</div>
)
}
// 父组件调用
function MyCom(){
return (
<div>
<MyComA/>
<MyComB/>
<MyComC/>
</div>
)
}
ReactDOM.render(<MyCom/>,document.getElementById("demo1"));
</script>
</body>
</html>
2、类组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
// 创建类组件 组件名首字母大写
class MyCom extends React.Component{
render(){
return (
<div>类组件</div>
)
}
}
let com = <MyCom/>
ReactDOM.render(com,document.getElementById("demo1"));
</script>
</body>
</html>
五、props:外部数据渲染
1、使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
// props
// props是react中的一个重要的属性 是组件对外的接口
// props可以从组件的外部向组件的内部进行数据的传递,也可以完成父组件给子组件的数据传递
// 注意:无论无状态组件还是类组件 我们都不能修改自身的props
// 一、无状态组件使用props
// 1.1、创建一个无状态组件
// function MyCom(props){
// return (
// <div>我是一个无状态组件。外部传递的数据是:{props.demo1},{props.demo2}</div>
// )
// }
// 二、类组件调用props
// 2.1 创建类组件
class MyCom extends React.Component {
render() {
return (
<div>
我是一个类组件 --- {this.props.demo1},{this.props.demo2}
</div>
)
}
}
// 定义变量
let text1 = "我是数据1";
let text2 = "我是数据2";
// 定义对象
let obj = {
demo1:"数据1",
demo2:"数据2"
}
// 方式一:传递多个变量
// ReactDOM.render(<MyCom demo1={text1} demo2={text2}/>,document.getElementById("demo1"));
// 方式二:传递多个变量。 ...obj:展开对象
ReactDOM.render(<MyCom {...obj}/>,document.getElementById("demo1"));
</script>
</body>
</html>
2、验证
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/babel-standalone/babel.min.js"></script>
<script src="../node_modules/prop-types/prop-types.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
// props
// 无状态组件的props 验证 和 默认值
// 一、无状态组件使用props
// 1.1、创建一个无状态组件
function MyCom(props){
return (
<div>我是一个无状态组件。外部传递的数据是:{props.demo1},{props.demo2}</div>
)
}
// 设置MyCom.props 默认值(16以后的版本写法)
MyCom.defaultProps={
demo1:"数据1",
demo2:"数据2"
}
// 如果是15x版本的react,写法为
// function MyCom(props){
// props.demo1=props.demo1||"数据1"
// return (
// <div>我是一个无状态组件。外部传递的数据是:{props.demo1}</div>
// )
// }
// props验证 -- 验证过来的数据是否符合我们期待的类型和请求,上线模式请取消
// 1、引入prop-types库
// npm install --save prop-types
MyCom.propTypes={
demo1:PropTypes.number // 验证是否为数字类型
}
ReactDOM.render(<MyCom/>,document.getElementById("demo1"));
</script>
</body>
</html>
3、默认值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/babel-standalone/babel.min.js"></script>
<script src="../node_modules/prop-types/prop-types.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
// props
// 类组件的props 验证 和 默认值
// 一、类组件使用props
// 1.1 创建类组件
class MyCom extends React.Component {
// 方式二:props 设置默认值
static defaultProps={
demo1:"数据1",
demo2:"数据2"
}
render() {
return (
<div>
我是一个类组件 --- {this.props.demo1},{this.props.demo2}
</div>
)
}
}
// 方式一:设置MyCom.props 默认值(16以后的版本写法)
// MyCom.defaultProps={
// demo1:"数据1",
// demo2:"数据2"
// }
ReactDOM.render(<MyCom/>,document.getElementById("demo1"));
</script>
</body>
</html>
4、外部渲染数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/babel-standalone/babel.min.js"></script>
<script src="../node_modules/prop-types/prop-types.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
// props 外部渲染数据
// 之前数据都是存在组件内部,如何渲染外部传递进来的props数据
let bool = true;
let dataArr = ["arr1","arr2","arr3"];
let MyCom=(props)=>{
return (
<div style={{display:bool?'block':'none'}}>
{
props.arr.map((v,i)=>{
return <p key={i}>{v}</p>
})
}
</div>
)
}
let Com=()=>{
return (<div>
<h1 onClick={()=>{bool=!bool;render();}}>父组件</h1>
<MyCom arr={dataArr}/>
</div>)
}
function render(){
ReactDOM.render(<Com/>,document.getElementById("demo1"));
}
render();
</script>
</body>
</html>
六、state:内部数据渲染
1、state的定义 与 props的区别
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
// 1、state与props的区别
// state是可变的
// props对于当前页面组件,是只读,如果想要修改props,则需要修改传递数据给当前组件的父组件的内容进行修改
// props是组件的对外的接口
// state是组件的对内的接口
// 组件内可以引用其他组件 组件之间的引用就形成了一个树状的接口
// 如果下层组件需要使用上层组件的数据,上层组件就可以通过下层组件的props进行数据传递
// 组件除了使用上层组件传递的数据外,自身也会有需要管理的数据,对内的管理属性就是state
// react只需要关心的是数据,当数据改变页面自动发生改变。
// 状态state等同于页面中的数据 状态/数据改变,页面中对应的数据绑定内容就会被react自动进行改变
// 声明式渲染:一切的数据改变都不用我们关心,只需要声明好数据,react就会自动对于数据进行相应的改变
// 如果使用状态,那么不能使用无状态组件
class Com extends React.Component{
// ES6中不管子类写不写constructor 在new实例的时候都会自动补上constructor
// 可以不写constructor,但是如果写了必须要写super()
// super():作用就是指向父类的构造方法
constructor(props){
// 如果想在constructor使用props,那么super中必须写上props
super(props)
// 定义 state
this.state={
name:"xixi",
age:18
}
}
render(){
return (
<div>
{/* this.setState({key:newValue}) 异步的 react自动触发render()进行数据渲染*/}
<button onClick={()=>{this.setState({name:"haha"})}}>点我改变state的数据</button>
<div>
我是一个类组件---{this.state.name},{this.state.age}
</div>
</div>
)
}
}
ReactDOM.render(<Com/>,document.getElementById("demo1"));
</script>
</body>
</html>
2、修改state数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
let bool = true;
// this.setState({})是异步
class Com extends React.Component{
constructor(props){
super(props)
this.state={
name:"xixi",
age:18,
newString:'<p>字符串</p>',
newHtml:<p>标签</p>
}
}
fun=()=>{
bool=!bool;
let name,age;
if(bool){
name = 'xixi';
age = 18;
}else {
name = 'haha';
age = 20;
}
// 异步,增加回调函数。()=>{}
this.setState({
name:name,
age:age
},()=>{
console.log(this.state.name,this.state.age)
})
}
render(){
return (
<div>
{/*fun不加(),如果加了会自动执行*/}
<button onClick={this.fun}>点我试试</button>
{this.state.name},{this.state.age}
<div>{this.state.newString}</div>
{/*字符串插入标签用(__HTML两个下划线):dangerouslySetInnerHTML={{__html:你要插入的字符串标签}}}*/}
<div dangerouslySetInnerHTML={{__html:this.state.newString}}></div>
<div>{this.state.newHtml}</div>
</div>
)
}
}
ReactDOM.render(<Com/>,document.getElementById("demo1"));
</script>
</body>
</html>
七、refs:转发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
// refs 转发
// react当中提供一个ref的数据(不能再无状态组件当中使用,因为无状态组件没有实例)
// 表示当前组件的真正实例的引用 它会返回绑定当前属性的元素
// 标识组件内部的元素 -- 方便我们查找
// react提供 三种方式进行ref的使用
// 1、字符串
// 2、回调函数(推荐)就是在dom节点上或者组件上挂载函数
// 函数的入参形式是dom节点 达到的效果和字符串是一样的 都是获取值的引用
// 3、React.createRef(React16.3新提供的一种方式)
// 把值赋给一个变量 通过ref挂载在节点或者组件上 使用ref的current属性拿到这个节点
// 官方建议不要过度使用refs对逻辑处理 需要优先考虑state
class Com extends React.Component{
constructor(props){
super(props)
this.myRef=React.createRef();
}
fun=()=>{
// 1、字符串
// console.log(this.refs.demoInput.value)
// 2、回调函数
// console.log(this.textinput.value)
// 3、React.createRef
console.log(this.myRef.current.value)
}
render(){
return (<div>
{/*1、字符串
<input type="text" ref="demoInput" placeholder="请输入"/>
*/}
{/*、回调函数
<input type="text" ref={(input)=>{this.textinput=input}} placeholder="请输入"/>
*/}
<input type="text" ref={this.myRef} placeholder="请输入"/>
<button onClick={this.fun}>点我得到输入框的值</button>
</div>)
}
}
ReactDOM.render(<Com/>,document.getElementById("demo1"));
</script>
</body>
</html>
八、事件与this
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hellow React</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
// react事件处理
// 绑定事件使用小驼峰命名法,在绑定函数的时候不能加() -- 函数会立即执行
// 一、修改this指向
// 1、bind方式原地绑定
// 2、函数通过箭头函数进行创建
// 3、constructor中提前绑定
// 4、把事件调用写成箭头函数的调用方式
class Com extends React.Component{
constructor(props){
super(props)
this.func=this.func.bind(this)
}
funa() {
console.log(this)
}
funb=()=> {
console.log(this)
}
func() {
console.log(this)
}
fund() {
console.log(this)
}
fune=(i)=>{
console.log(i)
}
funf=(i,e)=>{
console.log(i)
console.log(e)
}
render(){
return (<div>
<button onClick={this.funa.bind(this)}>bind方式</button>
<button onClick={this.funb}>箭头方式</button>
<button onClick={this.func}>提前绑定方式</button>
<button onClick={()=>{this.fund()}}>调用方式为箭头函数</button>
<h1>函数实参传递</h1>
<button onClick={this.fune.bind(this,"bind方式")}>点我传递实参-bind方式</button>
<button onClick={()=>{this.fune("箭头函数")}}>点我传递实参-箭头函数</button>
<button onClick={(e)=>{this.funf("传递事件对象",e)}}>点我传递实参-传递事件对象</button>
</div>)
}
}
ReactDOM.render(<Com/>,document.getElementById("demo1"));
</script>
</body>
</html>
九、条件渲染
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hellow React</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
// 条件渲染 -- 根据状态的变化只渲染其中的一部分
// if语句 jsx中不允许有if
class Com extends React.Component{
constructor(props){
super(props)
this.state={
bool:true
}
}
fun=()=>{
this.setState({
bool:!this.state.bool
})
}
render(){
let text;
if(this.state.bool){
text = '你好'
}else {
text = '再见'
}
return (<div>
<button onClick={this.fun}>点我修改状态</button>
{text}
<div>三元运算:{this.state.bool?'呵呵':'哈哈'}</div>
</div>)
}
}
ReactDOM.render(<Com/>,document.getElementById("demo1"));
</script>
</body>
</html>
十、状态提升
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../node_modules/react/umd/react.development.js"></script>
<script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
<script src="../node_modules/babel-standalone/babel.min.js"></script>
</head>
<body>
<div id="demo1">
</div>
<script type="text/babel">
// 状态提升 多个组件需要反映相同的变化数据 提升数据到最近的父组件中
// 多个子组件需要利用对方状态的情况下 需要 状态提升
class A extends React.Component{
constructor(props){
super(props)
}
render(){
return (<div>
我是A组件--{this.props.text}
</div>)
}
}
class B extends React.Component{
constructor(props){
super(props)
}
render(){
return (<div>
我是B组件--{this.props.text}
</div>)
}
}
class Com extends React.Component{
constructor(props){
super(props)
this.state={
commentText:"A和B都想用的数据"
}
}
fun=()=>{
this.setState({
commentText:"修改:A和B都想用的数据"
})
}
render(){
return (<div>
我是com组件
<button onClick={this.fun}>点我换公用参数</button>
<A text={this.state.commentText}/>
<B text={this.state.commentText}/>
</div>)
}
}
ReactDOM.render(<Com/>,document.getElementById("demo1"));
</script>
</body>
</html>