react笔记-g900859
第一阶段
react简单例子
引入cdn 关于 react ReactDOM babel ReactDOM.render(dom,target,callback) dom 不需要加引号,因为这个片段需要babel 也就是需要运行在`<script type="text/babel"><script>` 中 let APP1 = ReactDOM.createRoot(get('#app1')) let APP2 = ReactDOM.createRoot(get('#app2')) 可以选择根元素 可以有多个根元素,拿到之后,可以使用APP1.render() 用法和上边一样,一般一个应用程序只需要一个根
数据定义与函数绑定
react绑定变量可以通过 {} 单大括号进行 包括函数的绑定也是一样
绑定事件函数也是跟原生类似 onClick = {method}
//假设已经引入了React,ReactDOM和bebal let msg = 'hello world!' function changeMsg(){ appRender() } let app = ReactDOM.createRoot(document.querySelector('#app')) let appRender = () => app.render(<div><p>{msg}</p> <button onClick={changeMsg}>改变MSG</buttom></div>) appRender() //这里需要注意{}写在dom上 不需要引号 //changMsg传参还未提到
react 类-组件的写法
react中可以写一个类继承自 React.component,然后这个类内部可以写函数 方法 变量 然后再实现render方法 返回一个(dom)
class App extends React.Component{ constructor(){ //这里不要忘记调用下super哦,不然继承的那些变量方法无法使用 super() this.state = { msg:'我是组件写法中的变量声明' } this.changeMsg = this.changeMsg.bind(this) } changeMsg(){ 请注意这个函数中的this在render函数渲染后默认指向的是undefined,因为是在严格模式下 this.setState({ msg:'我是组件写法修改后的变量' }) } render(){ return{ <div> <h1>{this.state.msg}</h1> <input name='button' type='button' value='修改数据' onClick={this.changMsg.bind(this)}/> //这里的bind(this)如果没写 那函数调用时的this将会时undefined </div> } } } ReactDOM.craeteRoot(document.querySelector('#app')).render(<App/>) //这里就不需要重新调用render函数了 因为人家内部实现了 数据修改自动重新渲染 //=bind(this)如果没写 那函数调用时的this将会时undefined,也可使用箭头函数解决问题,也可在constructor中写
列表的展示方法
数组类型的放在dom中它会自己遍历 利用这个特性我们可以这样做
constructor(){ this.state={ movies: ['变形金刚', '王者归来', '指环王', '泡泡历险记'] } } render(){ return{ <div> <ul> {this.state.movies.map((item,index)=><li key={item}>{item}</li>)} //这里会返回一个数组 数组元素都是dom ['<li>dom</li>','<li>dom</li>'],会被遍历 </ul> </div> } }
计数器案例
计数器案例可以复习前边所学
可以使用结构 class Root extends React.Component { constructor() { super() this.state = { count: 0 } console.log(this.increment); this.increment = this.increment.bind(this) this.decrement = this.decrement.bind(this) } increment(params) { //增加 this.setState({ count: this.state.count + 1 }) } decrement() { this.setState({ count: this.state.count - 1 }) } render() { const { state: { count }, increment, decrement } = this return ( <div> <h1>当前计数: {count}</h1> <button onClick={increment}>+++</button> <button onClick={decrement}>---</button> </div> ) } } ReactDOM.createRoot(document.querySelector('#root')).render(<Root />)
JSX的注释与数据类型
{/**这就是注释**/} 在.jsx文件中 可以 'ctrl + /' 数据类型的展示中需要注意 object不可以直接展示,会报错; 要是想显示里边的内容 可以在{}中调方法; 例如: Object.keys(object) null/undefined/true/false 不会显示 若要 请 toString 其他数据可以显示 数组的话会自动遍历 子元素规则同上 也可以使用表达式 isNaN ? 'ok':'no' 也可以抽成函数返回dom (这里要说一下 直接调用是不需要绑定this的,因为它在自己的作用域中直接执行了)
react事件绑定 最优写法
<button onClick={(e) => this.decrement(e,999)}>其他写法</button> //箭头函数写法 参数顺序和事件对象都没问题
react 属性绑定
直接写属性 值用大括号包裹变量 规则同js
react 条件渲染和列表渲染
//老规矩 假设基本框架代码已经存在 <h1>{isHidden.toString()} </h1> //因为布尔值 null undefined 在虚拟dom中显示空白 在逻辑代码中 可以使用短路语法 { isHidden || <h1>不隐藏</h1> } 列表渲染也同理 可以使用高阶函数 并且利用数组的链式调用 完成一系列操作 { Moives.filter(item=>item.score>99).map(item=> (<h1>item.name</h1>)) }
注意事项
直接调用没有this指向问题,但赋给事件则会有 使用箭头函数调 顺便解决e的问题
第二阶段
react 脚手架
react的脚手架可以傻瓜式的生成一个react DEMO;
首先你要确保你安装了 react的脚手架 “ create-react-app 项目名称”
值得注意的是你需要确认你输入的没有大写字母 否则可能会出现意想不到的错误
第一个demo
流程与vue类似
//index.js import ReactDOM from "react-dom/client"; import App from './components/App' const root = ReactDOM.createRoot(document.querySelector('#root')) root.render(<App/>) //app.jsx import React from "react"; class App extends React.Component { constructor() { super() this.state = { msg: '我爱react' } } changeMsg(e){ console.log(e); this.setState({ msg:'卧槽 你也配' }) } render(){ let {msg} = this.state return( <div> <h1>{msg}</h1> <button onClick={(e)=>this.changeMsg(e)}>修改值</button> </div> ) } } export default App
渲染结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!