react学习笔记

1.定义组件的方式

通过函数定义:

//通过props获取组件传来的参数
function App(props){
    return <div>props.name</div> 
}

<App name="aaa"></App>

通过class定义

class App extends React.Component{
    render(){
        let {name,age,children}=this.props //通过this.props获取组件携带的参数
        return (<div>{children}我的姓名是:{name},我的年龄是{age}</div>)
    }
}

<App name="aaa" age="18"><p>大家好</p></App>

2.生命周期

componentWillMount //组件挂载前
componentDidMount  //组件挂载后
componentWillUpdate //组件更新前
componentDidUpdate  //组件更新后
componentWillUnmount //组件卸载

3.事件的写法

class App extends React.Component{
    constructor(){
        super()
        this.handleClick1=this.handleClick1.bind(this)
    }
    handleClick0(){}
    handleClick1(){}
    handleClick2=()=>{}//常用
    handleClick3(index){} //可以这样得到参数
    render(){
         return (
            <div>
            <button onClick={this.handleClick0.bind(this)}></button>
            <button onClick={this.handleClick1}></button>
            <button onClick={this.handleClick2}></button>
             <button onClick={()=>this.handleClick3(index)}></button>
            </div>
        )
    }
}

4.表单

 class FormList extends React.Component {
        constructor() {
            super()
            this.state={name: '',age:''}
        }
        handleSubmit =()=>{
            alert('输入的为' + this.state.name)
            event.preventDefault();
        }
        handleChange=(e)=>{
            var val=e.target.value;
            var name=e.target.name
            console.log(val)
           //在ES6中,把属性名用[ ]括起来,则括号中就可以引用提前定义的变量。
            this.setState({
                [name]: val
            })
        }
        render() {

            return (<form onSubmit={this.handleSubmit}>
                <label>
                    Name:
                    <input name="name" type="text" value={this.state.name} onChange={this.handleChange}/>
                </label>
                <label>
                    age:
                    <input name="num" type="text" value={this.state.num} onChange={this.handleChange}/>
                </label>
                <input type="submit" value="Submit"/>
            </form>)
        }
    }
    ReactDOM.render(<FormList/>, document.querySelector('#app'))

5.组件传值

1.父传子通过this.props
    
   class Children extends React.Component{
      render(){
            return <div>{this.props.name}</div>
      }  
    }
   
    class Parent extends React.Component{
        constructor{
            super()
            this.state={name:'我是父亲的数据'}
        }
        render(){
            return (<Children name={this.state.name}/>)
        }
    }
  2.子传父 通过子组件调用父组件的方法 

     class Children extends React.Component{
        constructor(){
            super()
            this.state={
                son:'我是子组件的数据'
            }
        }
        componentWillMount(){
            this.props.aaa(this.state.son)
        }
        render(){
            return (<div></div>)
        }
    }
    class Parent extends React.Component{
        constructor(){
            super()
            this.state={
                msg:''
            }
        }
        parentFn=(msg)=>{
            this.setState({
                msg
            })
        }
        render(){
            return (<div>
                {this.state.msg}
                <Children aaa={this.parentFn}></Children>
            </div>)
        }
    }

6.获取react元素

//1.refs的使用
<input type="text" ref='inp' />

this.refs.inp.value //这样就可以获取到input的值

//2.回调函数的形式
<input type="text" ref={input=>this.input=input} />

this.input.value //这样同样可以获取到input的值

7.新增的contextApi(状态管理)

A->B->C->D如果我们想让A组件的数据传到D组件供D组件使用的话  不考虑使用redux的情况该怎么实现呢?

我们可以将A组件的数据通过props传给B 然后B再通过props传给C C再通过props传给D 这样是可以实现  但是是不是太繁琐了....

重点来了  我们的react16.3.0版本(所以版本是16.3.0以上的版本才可以使用这个api)新增了一个contextApi 可以集中管理状态  

import  React,{Component,createContext} from 'react';
import ReactDom from 'react-dom'
let {Provider,Consumer}= createContext() //Provider 状态的提供者 Consumer状态的使用者
class ProviderComponent extends React.Component{
    state={
        a:1,
        b:2
    }
    changeA=(a)=>{
        this.setState({a})
    }
    render(){
        return (<Provider value={{state:this.state,onChange:this.changeA}}>//注意这个value命名是不能改的  下面的形参可以随便命名
            {this.props.children}
        </Provider>)
    }
}
class Child extends React.Component{
    render(){
        return<div>
            <Consumer> //Consumer 里面放函数  
                {(value)=>
                   <div>
                       <h3>{value.state.a}</h3>
                       <button onClick={()=>value.onChange(10)}>改变a的值</button>
                   </div>
                }
            </Consumer>
        </div>
    }
}
class App extends React.Component{
    render(){
        return (<div>
            <Child></Child>
        </div>)
    }
}
ReactDom.render(<ProviderComponent><App></App></ProviderComponent>,document.querySelector('#root'))

8.路由

重点来了~

     先说简单路由

//react-router-dom需要下载
import {BrowserRouter,Switch,Link,Route} from 'react-router-dom'

class App extends React.Component{
    render(){
        return (<div>
                    <Header></Header>
                    <Main></Main>
                </div>)
    }
}

class Header extends React.Component{
    render(){
        return (<div>
                    <Link to="/">首页</Link>
                    <Link to="/about">关于</Link>
                    <Link to="/me">我的</Link>
                </div>)
    }
}

class Main extends React.Component{
    render(){
        return (<div>
                    <Switch> //每次只允许一个Route展示 exact是精确展示
                        <Route exact path="/" component={Home} /> 
                        <Route path="/about" component={About} />
                        <Route path="/me" component={Me} />
                    </Switch>
                </div>)
    }
}

ReactDom.Render(<App/>,document.getElementById('app'))

     再说一下嵌套路由

import React from 'react';
import ReactDOM from 'react-dom';
import {BrowserRouter, Switch, Link, Route, NavLink, Redirect} from 'react-router-dom'
import './index.css'
let List=[
    {id:1, name:'aaa', sex:'男', age:6},
    {id:2, name:'bbb', sex:'男', age:12},
    {id:3, name:'ccc', sex:'女', age:5},
    {id:4, name:'ddd', sex:'男', age:10},
]

//NavLink 可以加选中样式 可以用activeClassName 也可以用activeStyle={{color:'red'}}
class Nav extends React.Component{
    render() {
        return (
            <div>
                <NavLink to='/home'  className="link" activeClassName='active'>首页</NavLink>
                <NavLink to='/about' className="link" activeClassName='active'>关于</NavLink>
                <NavLink to='/stu' className="link" activeClassName='active'>学生</NavLink>
            </div>
        );
    }
}
class NotFound extends React.Component{
    state={
        time:5
    }
    componentDidMount(){
       this.timer= setInterval(()=>{
            this.setState({
                time:this.state.time-1
            })
            if(this.state.time==0){
               //路由组件都有this.props属性  里面有history等对象
               this.props.history.push('/home')
            }
        },1000)
    }
    componentWillUnmount(){
        clearInterval(this.timer)
    }
    render() {
        return (
            <div>
                {`页面不存在,${this.state.time}s,返回主页`}
            </div>
        );
    }
}
// 内容 Redirect 重定向         
class Mian extends React.Component{
    render() {
        return (
            <div>
               <Switch>
                   <Route path='/home' component={Home}></Route>
                   <Route path='/About' component={About}></Route>
                   <Route exact path='/stu' component={Stu}></Route>
                   <Route path='/stu/:id' component={StuInfo}></Route>
                   <Redirect exact from='/' to='/home'></Redirect>
                   <Route component={NotFound}></Route>
               </Switch>
            </div>
        );
    }
}
class Home extends React.Component{
    render() {
        return (
            <div>
                我是首页
            </div>
        );
    }
}
class About extends React.Component{
    render() {
        return (
            <div>
                我是关于
            </div>
        );
    }
}
class StuInfo extends React.Component{
    render() {
        let {id}=this.props.match.params
        let itemInfo=List.find((item)=>{
            return item.id==id
        })
        return (
            <div>
               <p>{itemInfo.id}</p>
               <p>{itemInfo.name}</p>
               <p>{itemInfo.age}</p>
            </div>
        );
    }
}
class Stu extends React.Component{
    render() {
        return (
            <div>
                {
                    List.map((item,index)=>{
                        return <Link key={item.id} to={`/stu/${item.id}`}>{item.name}</Link>
                    })
                }
            </div>
        );
    }
}
class App extends React.Component{
    render() {
        return (<div>
            <Nav></Nav>
            <Mian></Mian>
        </div>)

    }
}
ReactDOM.render(<BrowserRouter><App /></BrowserRouter>, document.getElementById('root'));

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值