react笔记
1.react 不使用模板
不是mvc框架 响应式 轻量级js库
2虚拟Dom
确保对界面上真正发生的部分进行实际的Dom操作,逐层次的来进行节点比较。
3.react 环境搭建
React react-dom.js babel.js es6转es5 JSX转JavaScript
下载 npm I react - - save npm I react-dom - - save npm I babel-standalone –save
4.jsx的语法
注释必须 {/* 这是注释的内容 */}
{ } 花括号里面可以进行计算
不能写class 因为这是javascript有的
写className
Map 循环有返回值,forEach循环没有返回值。
遍历对象key值,Object.keys(obj) 返回一个数组 含对象所有key值的
遍历对象的值 Object.keys(obj).map((I,v)=>{
return <p key={i}>遍历属性:{v}-------------遍历属性值{obj[v]}</p>
})
5.组件
高耦合低内聚:高耦合就是把逻辑紧密的内容放到一个组件里面,低内聚:把不同组件的依赖关系尽量弱化,每个组件尽可能的独立。
构建方式,组件属性 生命周期
组件分为3部分: 属性props 状态state 生命周期
组件名字必须以大写字母开头 可以写成单标签调用或者双标签调用
Props只读
组件无论是使用函数声明还是class声明,都不可更改props。
分为无状态组件和类组件
传值方法:
let obj={
aa:"ll",
bb:"89"
}
<Clock {...obj}/> 解析后相当于aa=ll,bb=89, 传值多的时候可以用扩展运算符
或者 <Clock aa=”123” bb=””hfhffh/>
如果没有传值,可以设置默认传值,Clock.defaultProps = {aa:”123” }
Props 验证 验证传递过来的是否符合期望的类型或者要求,上线模式中取消props
6.State和生命周期
State是组件对内的接口,props是组件对外的接口
自身需要管理的数据,对内管理的属性是state
State是可变的,状态数据改变了,页面对应的绑定数据会自动进行改变。
使用状态 不能使用无状态组件,要使用class声明的组件。
State的用法: 写constructor 必须写super() 指向父类的构造函数 this.setState 是异步的,可以自动触发 render进行数据的渲染
class Com extends React.Component {
constructor(props) {
super(props)
this.state = {
aa: "123",
}
}
render() {
return (
<div>
<button onClick={() => { this.setState({ aa: 90 }) }}>gaibian</button>
<div>------{this.state.aa}</div>
</div>
)
}
}
ReactDOM.render(
<Com />,
document.getElementById('demo')
);
如果想插入显示页面aa= <h1>123</h1>不能直接{this.State.aa} 应该<div dangerouslySetInner></div>
dangerouslySetInnerHtml 是react 中innerHtml在浏览器Dom使用的替代品。
onChange 事件的行为与你期望的一样,每当表单 字段发生更改的,将会触发事件。
componentDidMount()方法会在组件已经被渲染到Domhou 运行,可以设置定时器。
ComponentWillUnmount()生命周期中清除计时器,使用this.setState()来时刻更新state。
不能直接修改State,用setState.state的更新可能是异步的。
This.props和this.state可能会异步更新,所以不要依赖他们的值来更新下一个。
State的更新可能会被合并
7.事件处理
React 事件的命名采用小驼峰式,不是纯小写。
使用jsx语法需要传入一个函数作为事件处理函数,而不是一个字符串。
React不能返回false的方式阻止默认行为。你必须显示的使用preventDefault。
e.preventDefault();
8.条件渲染&列表渲染
条件渲染 : if、三目运算符、&&
render() { // 三目运算符 // return <div> // {this.state.isLogin ? (<div>jkdsjfsdjkfjdsjgk</div>):( // <div> // mima:<input /> <br/> // user:<input /> <br/> // <button onClick={this.login}>denglu</button> // </div> // )} // </div> // && return ( <div> {this.state.isLogin && <div>jkdsjfsdjkfjdsjgk</div>} {!this.state.isLogin && ( <div> mima: <input /> <br /> user: <input /> <br /> <button onClick={this.login}>denglu</button> </div> )} </div> ); // 条件语句 // if (this.state.isLogin) { // return <div>jkdsjfsdjkfjdsjgk</div>; // } else { // return <div> // mima:<input /> <br/> // user:<input /> <br/> // <button onClick={this.login}>denglu</button> // </div>; // } }
列表渲染 数组map
return ( <div> <ul> {this.state.arr.map((item) => { return <li key={item.id}>{item.name}</li>; })} </ul> </div> );
9.受控组件 & 非受控组件ref
受控组件 即实现input的双向绑定
10.父子组件传值
父组件
import React, { Component } from "react"; import Son from "./Son"; //引入子组件 class Parent extends Component { constructor(){ super() this.state = { age:32, name:'jkkk' } } getValue = (data) => { // 接收子组件传过来的值 console.log(data); // 打印传递 过来的数据
};
render() {
return (
<div>
父组件
<Son name={this.state.name} age={this.state.age} callback={this.getValue} /> // 父组件传值
</div>
);
}
}
export default Parent;
子组件:
import React, { Component } from "react"; class Son extends Component { toChuanzhi=()=>{ // 子组件 -----> 父组件 this.props.callback({ // 在callback里面传值给父组件 name:'oooo', kkk:'kldkflds' }) } render() { return ( <div> zi组件 <br /> {this.props.name}-----{this.props.age} // 接收父组件的值 <button onClick={this.toChuanzhi}>点击传值给父组件</button> <br /> </div> ); } } export default Son;
11. react-router-dom 的使用
列表一
import React, { Component } from 'react' export default class GoodsList extends Component { render() { return ( <div> <ul> <li>dfdsf</li> <li>kdskfl</li> </ul> </div> ) } }
列表二
import React, { Component } from 'react' export default class FoodList extends Component { render() { return ( <div> <ul> <li>1</li> <li>12</li> <li>123</li> </ul> </div> ) } }
index.jsx
import React, { Component } from "react"; import { BrowserRouter as Router, Route, Link } from "react-router-dom"; import GoodsList from "./GoodsList"; import FoodList from "./FoodList"; export default class index extends Component { render() { return ( <div> <Router> <div> <Link to="/a">GoodsList</Link> <Link to="/b">FoodList</Link> <div> <Route path="/a" component={GoodsList} /> <Route path="/b" component={FoodList} /> </div> </div> </Router> </div> ); } }