Facebook 内部用来开发 Instagram,2013 年开源了 React,随后发布了 React Native
npm install react -S
npm install react-dom -S
npm install @babel/standalone -S
npm i -S react react-dom @babel/standalone
下载完成后,用
<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.js"></script>
<body>
<div id='root'></div>
<!--
当 babel-standalone 发现 type="text/babel" 类型标签的时候:
1. 将 script 标签中的内容转换为浏览器可以识别的 JavaScript
-->
<script type="text/babel">
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
);
</script>
</body>
var element = Hello, world!
;
它被称为 JSX,是一个 JavaScript 的语法扩展
JSX 全称 JavaScript XML ,是一种扩展的 JavaScript 语言,它允许 HTML 语言直接写在 JavaScript 语言中,不加任何引号,这就是 JSX 语法。它允许 HTML 与 JavaScript 的混写。
// es5 函数组件
// 组件,从概念上类似于 JavaScript 函数。它接受任意的入参(即 “props”),并返回用于描述页面展示内容的 React 元素。
function Welcome(props){
return <h1>Hello, world!{props.name}</h1>;
}
// es6 class组件
class Hello extends React.Component {
// 构造函数
constructor(props) {
super(props); //调用父类构造函数
}
render(){
return (
<div>
<h1>class组件 Hello, world!{this.props.name}</h1>
<ul>
<li>html</li>
<li>css</li>
<li>javascript</li>
</ul>
</div>
)
}
}
<Welcom name='react'></Welcome>
<Hello name='vue'/>
class Clock extends React.Component{
constructor(props){
super(props);
this.state = {
currentDate: new Date(),
username: '小明',
password: '',
}
}
render(){
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.currentDate.toLocaleTimeString()}.</h2>
<h3>{this.state.username}</h3>
</div>
)
}
// 启动定时器
componentDidMount() {
console.log('componentDidMount >>>');
this.timerID =setInterval(() => this.tick(), 1000);
}
// 清除定时器
componentWillUnmount(){
clearInterval( this.timerID);
console.log('清除定时器');
}
tick(){
// 改变state中数据只能通过setState方法
this.setState({
currentDate : new Date()
});
}
}
ReactDOM.render(
<Clock/>,
document.getElementById('root')
);
在事件绑定的方法中用到this,一定要通过bind(this)绑定
this.onHandleClick = this.onHandleClick.bind(this);
class App extends React.Component{
constructor(props){
super(props);
}
onHandleClick(){
alert('hello world');
}
render(){
return (
<div>
<button onClick={this.onHandleClick}>按钮</button>
</div>
)
}
}
// function onHandleClick() {
// alert('hello world');
// }
// const element = (
//
//
//
// )
ReactDOM.render(
<App/>,
document.getElementById('root')
);
class ListUl extends React.Component{
constructor(props){
super(props);
this.state = {
courses : ['html','javascript','css','vue','react']
}
}
render(){
return (
<div>
<ul>
{
// this.state.courses.map((item)=>{
// return {item} ;
// } )
}
{this.getLiItem()}
</ul>
</div>
)
}
getLiItem(){
return this.state.courses.map((item,index)=>{
return <li key={index}>{item}</li>;
} )
}
}
ReactDOM.render(
<ListUl/>,
document.getElementById('root')
);
// 打印表单输入框数据
class FromName extends React.Component{
constructor(props){
super(props);
this.state = {
username: ''
}
this.onHandleSubmit = this.onHandleSubmit.bind(this);
this.onHandleChange = this.onHandleChange.bind(this);
}
onHandleSubmit(e){
alert('hello :'+ this.state.username);
e.preventDefault(); //阻止默认submit提交事件,不再执行action请求刷新页面
}
onHandleChange(e){
this.setState({
username: e.target.value // e.target.value获取当前表单项值
});
}
render(){
return (
<div>
<form onSubmit={this.onHandleSubmit}>
<input value={this.state.username} placeholder='请输入信息' onChange={this.onHandleChange} />{this.state.username}
<input type="submit" value="提交" />
</form>
</div>
)
}
}
ReactDOM.render(
<FromName />,
document.getElementById('root')
);