参考:
菜鸟react
react-template 模板
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>React-Template</title>
<script src="../js/react.min.js"></script>
<script src="../js/react-dom.min.js"></script>
<!-- 转换浏览器 接受的语法 -->
<script src="../js/browser.min.js"></script>
</head>
<body>
<!-- 容器 -->
<!-- ReactDOM.render -->
<div id="box"></div>
<script type='text/babel'>
var myStyle = {
fontSize: 14,
color: 'green'
},
i = 1,
arr = [
<h1>数组形式</h1>,
<h2>数组2</h2>,
];
ReactDOM.render(
<div>
<h1 style= {myStyle} >菜鸟教程</h1>
<h2>欢迎学习 React { i == 1? '1' : '0' }</h2>
{/* 注释.. */}
{arr}
</div>,
document.getElementById('box')
);
</script>
</body>
</html>
引用 格式:
使用:
react-组件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>React-组件</title>
<script src="../js/react.min.js"></script>
<script src="../js/react-dom.min.js"></script>
<script src="../js/browser.min.js"></script>
</head>
<body>
<div id="box"></div>
<script type='text/babel'>
// 组件名 开头大写 需要拥有根标签包裹
//在添加属性时, class 属性需要写成 className ,for 属性需要写成 htmlFor ,这是因为 class 和 for 是 JavaScript 的保留字。
// 组件 属性--> this.props.属性名
var MyComponent = React.createClass({
render: function(){
return (
<div>
<h2>{this.props.title}!</h2>
<p className='ONE' htmlFor='one'>正文</p>
</div>
);
}
})
ReactDOM.render(
<div>
<MyComponent title="henery" />
<MyComponent title="aisx" />
</div>,
document.getElementById('box')
);
</script>
</body>
</html>
react-事件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>React-事件</title>
<link rel="stylesheet" href="../css/main.css">
<script src="../js/react.min.js"></script>
<script src="../js/react-dom.min.js"></script>
<script src="../js/browser.min.js"></script>
</head>
<body>
<div id="box"></div>
<script type='text/babel'>
var Comment = React.createClass({
edit: function(){
alert('edit Comment');
},
remove: function(){
{/* 事件 this 绑定*/}
alert('remove Comment');
},
render: function(){
return (
<div className='commentContainer'>
<div>{this.props.children}</div>
{/* 事件onClick */}
<button className='button-primary' onClick={this.edit} >edit</button>
<button className='button-danger' onClick={this.remove} >remove</button>
</div>
);
}
})
ReactDOM.render(
<div className='board'>
<Comment>hello every</Comment>
<Comment>hello apple</Comment>
</div>,
document.getElementById('box')
);
</script>
</body>
</html>
react-状态state,属性props
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>React-state</title>
<script src="../js/react.min.js"></script>
<script src="../js/react-dom.min.js"></script>
<script src="../js/browser.min.js"></script>
</head>
<body>
<div id="box"></div>
<script type='text/babel'>
var Checked = React.createClass({
getInitialState() {
return {
check: true
};
},
handleClick() {
this.setState({
check: !this.state.check
})
},
render() {
return (
<div>
<input type="checkbox" checked={this.state.check} onChange={this.handleClick} />
<p>this is {this.state.check ? 'checked' : 'unchecked'}</p>
<p>{this.props.title}</p>
</div>
);
}
})
ReactDOM.render(
<Checked title='属性props稳定值. 状态state易改' />,
document.getElementById('box')
);
</script>
</body>
</html>
react-状态应用
react-状态应用
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>React-状态应用 </title>
<link rel="stylesheet" href="../css/main.css">
<script src="../js/react.min.js"></script>
<script src="../js/react-dom.min.js"></script>
<script src="../js/browser.min.js"></script>
</head>
<body>
<div id="box"></div>
<script type='text/babel'>
var Comment = React.createClass({
getInitialState(){
return {
status: false,
change: false,
value: ''
};
},
edit: function(){
this.setState({
status: true
})
},
remove: function(){
{/* 事件 this 绑定*/}
alert('remove Comment');
},
save(){
var values = document.getElementById('text').value;
this.setState({
status: false,
change: true,
value: values
})
},
normal(){
return (
<div className='commentContainer'>
<div>{this.state.change?this.state.value:this.props.children}</div>
<button className='button-primary' onClick={this.edit} >edit</button>
<button className='button-danger' onClick={this.remove} >remove</button>
</div>
);
},
change(){
return (
<div className='commentContainer'>
<textarea defaultValue={this.state.change?this.state.value:this.props.children} id='text'></textarea>
<button className='button-success' onClick={this.save} >save</button>
</div>
);
},
render: function(){
return this.state.status?this.change():this.normal();
}
})
ReactDOM.render(
<div className='board'>
<Comment>hello every</Comment>
<Comment>hello apple</Comment>
</div>,
document.getElementById('box')
);
</script>
</body>
</html>
React-组件嵌套,跨组件调用
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>React-组件嵌套,跨组件调用 </title>
<link rel="stylesheet" href="../css/main.css">
<script src="../js/react.min.js"></script>
<script src="../js/react-dom.min.js"></script>
<script src="../js/browser.min.js"></script>
</head>
<body>
<div id="box"></div>
<script type='text/babel'>
var Comment = React.createClass({
getInitialState(){
return ({
status: false
});
},
edit: function(){
this.setState({
status: true
})
},
remove: function(){
{/* 事件 this 绑定*/}
this.props.dataRemove(this.props.index);
},
save(){
var val = this.refs.newText.value;
// 调用 上级传过来的方法
this.props.dataUpdate(val,this.props.index);
this.setState({
status: false
})
},
normal(){
return (
<div className='commentContainer'>
<div>{this.props.children}</div>
<button className='button-primary' onClick={this.edit} >edit</button>
<button className='button-danger' onClick={this.remove} >remove</button>
</div>
);
},
change(){
return (
<div className='commentContainer'>
{/* ref 当前这个标签*/}
<textarea ref='newText' defaultValue={this.props.children}></textarea>
<button className='button-success' onClick={this.save} >save</button>
</div>
);
},
render: function(){
return this.state.status?this.change():this.normal();
}
})
var Board = React.createClass({
getInitialState(){
return ({
comments: ['hello,world','book','apple']
});
},
update(newText,i){
var arr = this.state.comments;
arr[i] = newText;
this.setState({
comments: arr
});
},
del(i){
var arr = this.state.comments;
arr.splice(i,1);
this.setState({
comments: arr
});
},
add(text){
var arr = this.state.comments;
arr.push(text);
this.setState({
comments: arr
});
},
render(){
{/*遍历 map*/}
{/*
return( 根标签 )
key优化
向下级组件传递方法
*/}
return (
<div>
<button className='button-success' onClick={this.add.bind(null,'default text')}>add new</button>
<div className='board create'>
{
this.state.comments.map(function (item,i) {
return (
<Comment dataRemove={this.del} dataUpdate={this.update} key={i} index={i} >{item}</Comment>
);
}.bind(this))
}
</div>
</div>
)
}
})
ReactDOM.render(
<Board />,
document.getElementById('box')
);
</script>
</body>
</html>
多个组件. 嵌套. 遍历 map
显示:
Board内属性记录方法, Comment内调用
this.refs使用