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

渲染结果:

posted @ 2023-03-04 10:41  云冬  阅读(75)  评论(0编辑  收藏  举报