1.todoList
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ToDoList</title>
<script src="../common/react/development.js"></script>
<script src="../common/react-dom/development.js"></script>
<script src="../common/babel.js"></script>
<script src="../common/prop-types.js"></script>
</head>
<body>
<div id="app1"></div>
<script type="text/babel">
/*
需求:
1.点击按钮提示第一个输入框的值
功能界面的组件化编码流程
1.拆分组件
2.实现静态组件
3.实现动态组件
动态显示初始化内容
交互功能(绑定事件监听)
问题:数据保存到哪个组件?
看数据哪些组件需要,如果多个需要操作数据就放到共同父类组件里面
问题:如何在子组件中改变父组件的状态?
子组件不能直接改变父组件的状态
状态在哪个组件,更新状态的行为就应该定义在哪个组件
解决:父组件定义函数传递给子组件
错误:
将字符串的ref用法和函数式的ref用法搞错了
*/
//ES6类组件
const App = class extends React.Component{
constructor(props){
super(props);
//初始化状态
this.state = {
todos:['吃饭','睡觉','豆豆','刷完','洗澡']
};
this.addTodo = this.addTodo.bind(this);
}
addTodo(item){
const {todos} = this.state;
todos.unshift(item);
//更新状态
this.setState(
{todos}
);
}
render(){
const {todos:doList} = this.state;
return(
<div>
<h1>Simple ToDo List</h1>
<Add count={doList.length} addTodo={this.addTodo}/>
<List todos={doList}/>
</div>
);
}
};
//自定义Add组件
const Add = class extends React.Component{
constructor(props){
super(props);
this.handleAdd = this.handleAdd.bind(this);
}
handleAdd(){
console.log("handleAdd--->",this);
//1.读取输入的数据
const item = this.todoinput.value.trim();
//2.检查合法性
if(!item){
return
}
//3.添加元素
const {addTodo} = this.props;
addTodo(item);
this.todoinput.value='';
}
render(){
const {count} = this.props;
return(
<div>
<input ref={node=>this.todoinput=node} type="text"/>
<button ref="dddd" onClick={this.handleAdd}>add #{count+1}</button>
</div>
);
}
};
Add.propTypes = {
count:PropTypes.number.isRequired,
addTodo:PropTypes.func.isRequired
};
const List = class extends React.Component{
constructor(props){
super(props);
}
render(){
const {todos:doList} = this.props;
return(
<div>
<ul>
{
doList.map((item,index)=>{ return <li key={index}>{item}</li>})
}
</ul>
</div>
);
}
};
//声明数据类型
List.propTypes = {
todos:PropTypes.array.isRequired
};
ReactDOM.render(<App/>, document.getElementById('app1'));
</script>
</body>
</html>
2.loginForm
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>LoginForm</title>
<script src="../common/react/development.js"></script>
<script src="../common/react-dom/development.js"></script>
<script src="../common/babel.js"></script>
<script src="../common/prop-types.js"></script>
</head>
<body>
<div id="app1"></div>
<script type="text/babel">
/*
需求:
1.点击按钮提示第一个输入框的值
功能界面的组件化编码流程
1.拆分组件
2.实现静态组件
3.实现动态组件
动态显示初始化内容
交互功能(绑定事件监听)
问题:数据保存到哪个组件?
看数据哪些组件需要,如果多个需要操作数据就放到共同父类组件里面
问题:如何在子组件中改变父组件的状态?
子组件不能直接改变父组件的状态
状态在哪个组件,更新状态的行为就应该定义在哪个组件
解决:父组件定义函数传递给子组件
错误:
将字符串的ref用法和函数式的ref用法搞错了
概念:
受控组件:
可以自动收集组件值到状态中去
非受控组件:
需要时候自己去拿组件的值
*/
const LoginForm = class extends React.Component{
constructor(props){
super(props);
this.state = {
pwd:'',
};
this.handleSubmit = this.handleSubmit.bind(this);
this.handlePwdChange = this.handlePwdChange.bind(this);
}
handleSubmit(e){
console.log("handleSubmit--->",this);
//阻止表单的默认提交
e.preventDefault();
const username = this.nameInput.value.trim();
alert(`准备提交的用户名:${username},密码:${this.state.pwd}`);
}
handlePwdChange(e){
const pwd = e.target.value.trim();
this.setState({pwd});
}
render(){
return(
<div>
<form action="/test" onSubmit={this.handleSubmit}>
用户名:<input ref={ins=>this.nameInput=ins} type="text"/>
密 码:<input type="password" value={this.state.pwd} onChange={this.handlePwdChange}/>
<input type="submit" value="登录"/>
</form>
</div>)
}
};
ReactDOM.render(<LoginForm/>, document.getElementById('app1'));
</script>
</body>
</html>
3.clock
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Clock</title>
<script src="../common/react/development.js"></script>
<script src="../common/react-dom/development.js"></script>
<script src="../common/babel.js"></script>
<script src="../common/prop-types.js"></script>
</head>
<body>
<div id="app1"></div>
<script type="text/babel">
/*
功能界面的组件化编码流程
1.拆分组件
2.实现静态组件
3.实现动态组件
动态显示初始化内容
交互功能(绑定事件监听)
问题:数据保存到哪个组件?
看数据哪些组件需要,如果多个需要操作数据就放到共同父类组件里面
问题:如何在子组件中改变父组件的状态?
子组件不能直接改变父组件的状态
状态在哪个组件,更新状态的行为就应该定义在哪个组件
解决:父组件定义函数传递给子组件
错误:
将字符串的ref用法和函数式的ref用法搞错了
概念:
受控组件:
可以自动收集组件值到状态中去
非受控组件:
需要时候自己去拿组件的值
*/
/*
生命周期(钩子函数)
1.初始化
componentWillMont():挂载之前-将要插入DOM时候回调
Render():挂载
componentDidMont():挂载之后-已经插入DOM时候回调
2.更新
componentWillUpdate():
this.setState()-Render():更新重新渲染
componentDidUpdate():
3.销毁
componentWillUnmount():卸载之前
unmountComponentAtNode():卸载
重要的勾子函数
render():渲染页面
componentDidMount():开启监听发送ajax请求
componentWillUnmount():做一些收尾的工作例如清理定时器
componentWillReceiveProps():后面讲
*/
const Clock = class extends React.Component{
constructor(props){
super(props);
//状态初始化
this.state = {
date:new Date().toLocaleString()
}
}
componentDidMount(){
setInterval(()=>{
this.setState({date:new Date().toLocaleString()})
},1000);
}
render(){
const {date} = this.state;
return(
<div>时间:{date}</div>
)
}
};
ReactDOM.render(<Clock />, document.getElementById('app1'));
</script>
</body>
</html>
4.animal
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>LoginForm</title>
<script src="../common/react/development.js"></script>
<script src="../common/react-dom/development.js"></script>
<script src="../common/babel.js"></script>
<script src="../common/prop-types.js"></script>
</head>
<body>
<div id="app1"></div>
<script type="text/babel">
/*
功能界面的组件化编码流程
1.拆分组件
2.实现静态组件
3.实现动态组件
动态显示初始化内容
交互功能(绑定事件监听)
问题:数据保存到哪个组件?
看数据哪些组件需要,如果多个需要操作数据就放到共同父类组件里面
问题:如何在子组件中改变父组件的状态?
子组件不能直接改变父组件的状态
状态在哪个组件,更新状态的行为就应该定义在哪个组件
解决:父组件定义函数传递给子组件
错误:
将字符串的ref用法和函数式的ref用法搞错了
概念:
受控组件:
可以自动收集组件值到状态中去
非受控组件:
需要时候自己去拿组件的值
*/
/*
生命周期(钩子函数)
1.初始化
componentWillMont():挂载之前-将要插入DOM时候回调
Render():挂载
componentDidMont():挂载之后-已经插入DOM时候回调
2.更新
componentWillUpdate():
this.setState()-Render():更新重新渲染
componentDidUpdate():
3.销毁
componentWillUnmount():卸载之前
unmountComponentAtNode():卸载
重要的勾子函数
render():渲染页面
componentDidMount():开启监听发送ajax请求
componentWillUnmount():做一些收尾的工作例如清理定时器
componentWillReceiveProps():后面讲
*/
class Life extends React.Component{
constructor(props){
super(props);
this.state = {
opacity:1
};
this.destroyComponent = this.destroyComponent.bind(this);
}
//即将挂载
//Render之前
componentWillMount(){
console.log("componentWillMount-即将挂载",this);
}
//内置函数,this指向类
//render之后
componentDidMount(){
console.log("componentDidMount-挂载之后",this);
this.clockId = setInterval(function () {
console.log("clock working...");
let {opacity} = this.state;
opacity -= 0.1;
if(opacity<=0){
opacity = 1;
}
this.setState({opacity});
}.bind(this),200);
}
//即将更新
//this.setState()之前
componentWillUpdate(){
console.log("componentWillUpdate-更新之前",this);
}
//更新之后
//this.setState()之后
componentDidUpdate(){
console.log("componentDidUpdate-更新之后",this);
}
//内置函数,this指向类
//卸载之前
componentWillUnmount(){
console.log("clock stop...");
clearInterval(this.clockId);
}
//点击按钮卸载定时器
//卸载之后只是界面卸载
//定时器还在执行
destroyComponent(){
//ReactDom提供的卸载组件的接口
ReactDOM.unmountComponentAtNode(document.getElementById('app1'));
}
render(){
const {msg} = this.props;
const {opacity} = this.state;
const style = {opacity};
return(
<div>
<h2 style={style}>{msg}</h2>
<button onClick={this.destroyComponent}>卸载动画</button>
</div>
)
}
}
ReactDOM.render(<Life msg="Hello React"/>, document.getElementById('app1'));
</script>
</body>
</html>