1_Hello World — React
官网文档:Hello World – React
<div id="root"></div>
<script type="text/babel">
// jsx语法:react提供的语法 javascript+xml语法
// 参数1:页面要展示的信息
// 参数2:要渲染内容的位置
ReactDOM.render(
<div>Hello React!</div>,
document.getElementById("root")
);
</script>
知识点:
- React:用于构建用户界面的 JavaScript 库。
最开始,很多人说React是MVC中的V,总结React就是一套为视图而准备的js框架 React由facebook打造的,致力于更快的DOM渲染和更易于维护的DOM层
- JSX:是一个 JavaScript 的语法扩展。
官方建议在 React 中配合使用 JSX,JSX 可以很好地描述 UI 应该呈现出它应有交互的本质形式。JSX 可能会使人联想到模版语言,但它具有 JavaScript 的全部功能。
2_JSX语法解析
官网文档:JSX 简介 – React
<div id="root"></div>
<script type="text/babel">
/*
jsx语法:
遇到{}按照js语法解析
遇到<>按照xml语法即系
每一个列表元素需要指定一个key最为唯一元素的索引
*/
var arr = ["iwen","ime","frank"];
ReactDOM.render(
<ul>
{
arr.map(function(item,index){
return <li key={index}>{ item }</li>
})
}
</ul>,
document.getElementById("root")
)
</script>
<div id="root"></div>
<script type="text/babel">
function tick(){
var current = (
<div>
<h3>当前时间</h3>
<p>{ new Date().toLocaleTimeString() }</p>
</div>
)
ReactDOM.render(current,document.getElementById("root"))
}
setInterval(tick,1000);
</script>
知识点:
- Babel 会把 JSX 转译成一个名为
React.createElement()
函数调用。React.createElement会预先执行一些检查,以帮助你编写无错代码
- JSX:能够防止注入攻击
React DOM 在渲染所有输入内容之前,默认会进行转义。它可以确保在你的应用中,永远不会注入那些并非自己明确编写的内容。所有的内容在渲染之前都被转换成了字符串。这样可以有效地防止 XSS(cross-site-scripting, 跨站脚本)攻击。
3_React基础组件
官网文档:组件 & Props – React
<div id="root"></div>
<script type="text/babel">
/*
组件:
在React中,整体是一个组件化设计
注意:组件的首字母必须大写
*/
var Hello = React.createClass({
render:function(){
return(
<div>Hello World!</div>
)
}
})
ReactDOM.render(<Hello />,document.getElementById("root"))
</script>
知识点:
- CreateClass函数在v15的版本存在,v16的版本去掉了
4_React组件嵌套
官网文档:组件 & Props – React
<div id="root"></div>
<script type="text/babel">
/*
组件:
组件中只能存在一个根容器
组件与组件之间可以互相嵌套
组件本身可以具有业务逻辑
*/
var LeftNav = React.createClass({
render:function(){
var navArr = ["百度","谷歌","bing"]
return(
<div>
<ul>
{
navArr.map(function(item,index){
return(
<li key={index}><a href="#">{ item }</a></li>
)
})
}
</ul>
</div>
)
}
})
var RightNav = React.createClass({
render:function(){
return(
<div>
<ul>
<li><a href="#">新闻</a></li>
<li><a href="#">地图</a></li>
<li><a href="#">视频</a></li>
</ul>
</div>
)
}
})
var Root = React.createClass({
render:function(){
return(
<div>
<LeftNav />
<RightNav />
</div>
)
}
})
ReactDOM.render(<Root />,document.getElementById("root"))
</script>
5_组件数据交互props
官网文档:组件 & Props – React
<div id="root"></div>
<script type="text/babel">
/*
组件数据交互:参数的传递
props
this.props.title
组件交互中的数据传递
*/
var Hello = React.createClass({
render:function(){
return(
<div>
{ this.props.title }
<Demo demo="你是dmeo" />
</div>
)
}
})
var Demo = React.createClass({
render:function(){
return(
<div>{ this.props.demo }</div>
)
}
})
ReactDOM.render(<Hello title="hello component" />,document.getElementById("root"))
</script>
<div id="root"></div>
<script type="text/babel">
/*
组件:
组件中只能存在一个根容器
组件与组件之间可以互相嵌套
组件本身可以具有业务逻辑
*/
var Nav = React.createClass({
render:function(){
return(
<div>
<ul>
{
this.props.navData.map(function(item,index){
return(
<li key={index}><a href="#">{ item }</a></li>
)
})
}
</ul>
</div>
)
}
})
var Root = React.createClass({
render:function(){
var nav1 = ["百度","谷歌"]
var nav2 = ["新闻","地图"]
return(
<div>
<Nav navData={nav1}/>
<Nav navData={nav2}/>
</div>
)
}
})
ReactDOM.render(<Root />,document.getElementById("root"))
</script>
6_样式添加与事件
官网文档:事件处理 – React
<style>
.container{
color: red;
}
</style>
<body>
<div id="root"></div>
<script type="text/babel">
/*
在React中,className,class是es6的关键字,es5中同样是保留关键字
行内样式:style={{color:'green',fontSize:"30px"}}
*/
var Hello = React.createClass({
render:function(){
var styleObj = {
color:'green',
fontSize:"30px"
}
return(
<div className="container">
<p>哈哈</p>
<span style={ styleObj }>hello</span>
</div>
)
}
})
ReactDOM.render(<Hello />,document.getElementById("root"))
</script>
</body>
<div id="root"></div>
<script type="text/babel">
var Hello = React.createClass({
handlerClick:function(event){
console.log("2222");
},
render:function(){
return(
<div>
<button onClick={ this.handlerClick }>按钮</button>
</div>
)
}
})
ReactDOM.render(<Hello />,document.getElementById("root"))
</script>
知识点:
- React DOM 使用
camelCase
(小驼峰命名)来定义属性的名称。因为 JSX 语法上更接近 JavaScript 而不是 HTML,所以不使用 HTML 属性名称的命名约定。 例如,JSX 里的 class 变成了 className,而 tabindex 则变为 tabIndex。
- preventDefault 阻止默认行为
在 React 中另一个不同点是你不能通过返回 false 的方式阻止默认行为。你必须显式的使用 preventDefault
7_React state状态
官网文档:State & 生命周期 – React、事件处理 – React
<div id="root"></div>
<script type="text/babel">
/*
state:组件内部的状态
props:组件之间的数据交互
*/
var Hello = React.createClass({
// 初始化state getInitialState:固定的
getInitialState:function(){
return{
value:"呵呵呵"
}
},
changeInfo:function(event){
this.setState({
value:'嘿嘿嘿'
})
},
render:function(){
return(
<div>
<p>{ this.state.value }</p>
<button onClick={ this.changeInfo }>按钮</button>
</div>
)
}
})
ReactDOM.render(<Hello />,document.getElementById("root"))
</script>
<div id="root"></div>
<script type="text/babel">
/*
state:组件内部的状态
props:组件之间的数据交互
setState:引起视图的重绘
虚拟DOM
*/
var Hello = React.createClass({
getInitialState:function(){
return{
value:true
}
},
changeInfo:function(event){
// 改变state状态
this.setState({
value: !this.state.value
})
},
render:function(){
var value = this.state.value;
// 在react中,三目运算符使用非常频繁
var info = value ? '孙悟空' : "六耳猕猴"
return(
<div>
<p>{ info }</p>
<button onClick={ this.changeInfo }>改变</button>
</div>
)
}
})
ReactDOM.render(<Hello />,document.getElementById("root"))
</script>
8_State 和 Props
官网文档:State & 生命周期 – React
<div id='root'></div>
<script type="text/babel">
/*
state和props的应用
*/
// 用于显示内容
var Person = React.createClass({
render:function(){
var name = this.props.name;
var age = this.props.age;
return(
<div>
<h3>{ name }</h3>
<p>{ age }</p>
</div>
)
}
})
// 处理业务逻辑
var User = React.createClass({
getInitialState:function(){
return{
name:"iwen",
age:20
}
},
changeInfo:function(event){
this.setState({
name:"ime",
age:30
})
},
render:function(){
return(
<div>
<Person name={this.state.name} age={this.state.age} />
<button onClick={ this.changeInfo }>按钮</button>
</div>
)
}
})
ReactDOM.render(<User />,document.getElementById("root"))
</script>
- State 与 props 类似,但是 state 是私有的,并且完全受控于当前组件
9_组件生命周期函数
官网文档:State & 生命周期 – React
<div id="root"></div>
<script type="text/babel">
/*
组件(component)的生命周期!
componentWillMount:组件渲染之前
componentDidMount:组件渲染之后
componentWillUnMount:组件卸载之前
shouldComponentUpdate:状态改变之后执行
componentWillUpdate:组件即将更新
componentDidUpdate:组件更新之后
componentWillReceiveProps:props改变之后执行
*/
var MyComponent = React.createClass({
// 初始化props
getDefaultProps:function(){
},
// 初始化state
getInitialState:function(){
return{
value:"孙悟空"
}
},
componentWillMount:function(){
console.log("组件渲染之前");
},
componentDidMount:function(){
console.log("组件渲染之后");
},
componentWillUnMount:function(){
console.log("组件卸载之前");
},
shouldComponentUpdate:function(){
console.log("state改变之前");
return true;
},
componentWillUpdate:function(){
console.log("组件state更新之前");
},
componentDidUpdate:function(){
console.log("组件state更新之后");
},
componentWillReceiveProps:function(){
},
changeInfo:function(){
this.setState({
value:"妖猴,休走!"
})
},
// 渲染
render:function(){
return(
<div>
<p>{ this.state.value }</p>
<button onClick={this.changeInfo}>按钮</button>
</div>
)
}
})
ReactDOM.render(<MyComponent />,document.getElementById("root"))
</script>
10_组件声明周期函数应用
官网文档:State & 生命周期 – React
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
<script src="dist/browser.min.js"></script>
<script src="dist/jquery.js"></script>
<script src="dist/react.js"></script>
<script src="dist/react-dom.js"></script>
<style media="screen">
.img{
width: 300px;
}
</style>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
var Hello = React.createClass({
getInitialState:function(){
return{
info:[{
title:"",
content:"",
img:""
}]
}
},
// 在生命周期函数中读取数据
// 在渲染完成之后执行数据加载
componentDidMount:function(){
$.ajax({
type:"get",
url:"http://www.wwtliu.com/sxtstu/blueberrypai/getIndexBanner.php",
success:function(data){
// info 修改state
this.setState({
info:data.banner
})
}.bind(this)
})
},
render:function(){
return(
<div>
<ul>
{
this.state.info.map(function(item,index){
return (
<li key={index}>
<h3>{ item.title }</h3>
<p>{ item.content }</p>
<img className="img" src={item.img} />
</li>
)
})
}
</ul>
</div>
)
}
})
ReactDOM.render(<Hello />,document.getElementById("root"))
</script>
</body>
</html>