1.1 React 起源于 Facebook 于2013年5月开源.
是一个用于构建用户界面的 JavaScript 库, 与vue,angular并称前端三大框架,现在最新版本是18
特点:-数据驱动(操作数据) - 组件化 - 虚拟DOM
开发环境:
- cdn引入js
<script src="./node_modules/react/umd/react.development.js"></script>
<script src="./node_modules/react-dom/umd/react-dom.production.min.js"></script>
<script src="./node_modules/babel-standalone/babel.js"></script>
- 脚手架
- webpack手动搭建
第一个react程序:
<body>
<div id="root">
</div>
<!-- 必须要按这个顺序引入 -->
<script src="../lib/react.development.js"></script>
<script src="../lib//react-dom.development.js"></script>
<script src="../lib/babel.js"></script>
<script type="text/babel">
const message="我的第一个React"
const user={name:'jack',age:18}
const element=(
<div>
<h2>{message}</h2>
<p>{user.name}-{user.age}</p>
</div>
)
ReactDOM.render(element,document.getElementById('root'))
</script>
</body>
如果要在element里面写注释的话:{/*我是注释 */}
jsx语法:
在以上的代码中,其实我们已经运用 jsx语法,那jsx语法到底是什么呢?
- 必须只能有一个根节点
- 多标签换行显示时写到一个小括号中
- 单标签不能省略结束标签。/>
- 遇到 HTML 标签 (以 < 开头) 就用 HTML 规则解析
- 遇到代码块(以 { 开头),就用 JavaScript 规则解析
- JSX 允许直接在模板中插入一个 JavaScript 表达式
react操作元素内容,样式,属性,事件
<body>
<div id="root"></div>
<!-- 必须要按这个顺序引入 -->
<script src="../lib/react.development.js"></script>
<script src="../lib//react-dom.development.js"></script>
<script src="../lib/babel.js"></script>
<script type="text/babel">
const title = "react元素操作";
const url = "http://www.baidu.com";
const pic =
"https://img0.baidu.com/it/u=1472391233,99561733&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1676394000&t=ab66e9b81c775a97854704a561505508";
const style1 = { color: "pink", backgroundColor: "red", width: "200px" };
const isOk = true;
function bindHander(){
console.log('触发事件')
}
const element = (
<div>
{/*操作内容*/}
<h2>{title}</h2>
{/*操作属性*/}
<a href={url}>百度</a>
{/*操作属性,样式*/}
<img src={pic} style={{ height: "100px" }} />
{/*操作样式方法二*/}
<p style={style1}>这是操作我的样式</p>
{/*三元运算*/}
{isOk ? "成功" : "失败"}
{/*操作事件*/}
<button style={{height:'30px',width:'60px'}} onClick={bindHander}></button>
</div>
);
ReactDOM.render(element, document.getElementById("root"));
</script>
</body>
Fragments:React 中的一个常见模式是一个组件返回多个元素。Fragments 允许你将子列表分组,而无需向 DOM 添加额外节点。
render(){
return (
<React.Fragment>
//此处相当于是模版字符串
</React.Fragment>
)}
组件:函数组件,类组件
函数组件:
- 定义函数的第一个字母大写
- 可以定义一个props形参。用于从外部向组件内传入数据
- 组件内返回描述UI界面的React元素,按jsx语法实现
类组件:
- 继承React.Component
- render方法返回描述UI界面的React元素
State:
操作组件内部状态数据,使用state
注: 在hooks出现之前,只能在类组件中使用
1. 获取state数据 this.state.***
2. 更新state数据 this.setState({age:20})
事件处理&this指向问题:
语法:
on+事件类型名= {事件处理函数}
如: onClick={()=>{}}
onFocus, onInput ...
注: 使用箭头函数,避免this指向问题
<body>
<div id="root"> </div>
<script type="text/babel">
class EventDemo extends React.Component {
constructor(props) {
super(props)
this.state = {
count: 0
}
// 绑定事件
// this.bindPlus = this.bindPlus.bind(this)
}
render() {
return (
<React.Fragment>
<h2>事件处理</h2>
<p>count: {this.state.count}</p>
{/* 第一种事件处理方式 */}
{/*<button onClick={this.bindPlus.bind(this)}>加一</button>*/}
{/* 第二种事件处理方式 */}
{/*<button onClick={this.bindPlus}>加一</button>*/}
{/* 第三种事件处理方式 */}
{/*<button onClick={ this.bindPlus}>加一</button>*/}
{/* 第四种事件处理方式 */}
<button onClick={ ()=>{this.bindPlus(10)}}>加一</button>
</React.Fragment>
)
}
bindPlus = (num) => {
this.setState({ count: num })
}
}
ReactDOM.render(<EventDemo />, document.getElementById('root'))
</script>
</body>
</html>
案例:
<body>
<div id="root"></div>
<script src="../lib/react.development.js"></script>
<script src="../lib/react-dom.development.js"></script>
<script src="../lib/babel.js"></script>
<script type ="text/babel" >
class Welcom extends React.Component {
constructor(props) {
super(props)
this.state = {
list:[
{ id: "1001", name: "C++", price: 89 },
{ id: "1002", name: "C", price: 39 },
{ id: "1003", name: "java", price: 56 }
],
inputValue:''
}
}
render() {
return(
<React.Fragment>
<input type="text" placeholder='请输入书名' value={this.state.inputValue} onInput={this.bindInputValue}/>
<button onClick={this.bindAddConfirm}>确定</button>
{this.state.list.map((item,index)=>{
return(
<div key={item.id}>
<input type='checkbox' checked={item.state} onChange={()=>{
this.bindChange(item.id)
}}/>
{item.id}-{item.name}
<input type="button" value='删除' onClick={()=>{
this.bindDelete(index)
}}/>
{item.state?'选中':'未选中'}
</div>
)
})}
</React.Fragment>
)
}
bindInputValue=(e)=>{
const inputValue=e.target.value
this.setState({inputValue})
}
bindAddConfirm=()=>{
const {inputValue,list} =this.state
list.push({
id:Math.floor(Math.random)*10,
name:inputValue,
state:false
})
// 更新
this.setState({inputValue:'',list})
}
// 删除
bindDelete=(index)=>{
const {list} =this.state
list.splice(index,1)
this.setState({list})
}
// 单选
bindChange=(id)=>{
const isChecked=event.target.value
const {list}=this.state
const book=list.find(item=>item.id===id)
book.state=!book.state
this.setState({list})
}
};
ReactDOM.render(<Welcom />, document.getElementById("root"))
</script>
</body>