React快速入门

创建项目


1.npx create-react-app myapp

2.cd myapp

3.npm start


文件说明

index.js文件:
//加快react运行速度的js文件
import * as serviceWorker from './serviceWorker';
补充:组件名称首字母必须大写

案例说明

数据基本绑定

import React, { Component } from 'react';
class Home extends Component {
    constructor() {
        super()
        this.state={
            user:{
                username:"qiang",
                age:30
            }
        }
    }

    render() {
        return (
            <div>
                <p>{this.state.user.username}</p>
                <p>{this.state.user.age}</p>
            </div>
        )
    }
}
export default Home;

style和class的绑定

说明:
class=> className
for => htmlFor


import React,{Component} from 'react';
import  '../assets/css/list.css';
class List extends Component{
    constructor(){
        super()
        this.state={
            name:["a","b","c"],
            style:{
                color:'red',
                fontsize:'40px'
            },
            color:'red',
            blue:'blue'
        }
    }

    render(){
        return(
            <div>
                <ul>
                <li style={this.state.style}>{this.state.name[0]}</li>
                // 注意此处:之所以两层{}是因为内部也是对象
                <li style={{color:'red'}}>{this.state.name[1]}</li>
                <li style={{color:this.state.color}}>{this.state.name[2]}</li>
                </ul>
                <br/>
                <ul>
                    <li className='blue'>字符串css</li>
                    <li className={this.state.blue}>变量css</li>
                </ul>
                // 此处for的特殊写法
                <label htmlFor='in'>测试</label>
                <input type='text' id='in'/>
                <br/>
            </div>
            
    
        )
    }
}
export default List;

图片引入和遍历

import React, { Component } from 'react';
import img from '../assets/image/a.png'

class New extends Component {
    constructor() {
        super()
        this.state = {
            arr:["a","b"],
            //注意此处内部元素没有""包裹
            arr1:[<p key="1">a</p>,<p key="2">b</p>]
        }
    }
    render() {
        //遍历方式一
        let listResult=this.state.arr.map((val,index)=>{
            return <p key={index}>{val}--{index}</p>
        })
        return (
            <div>
                <p>引入图片方式一</p>
                <img src={img} />
                <p>引入图片方式二</p>
                <img src={require('../assets/image/a.png')} /><br/>
                {this.state.arr1}<br/>
                {listResult}<br/>
                //遍历方式二
                {
                    this.state.arr.map((val,index)=>{
                        return <p key={index}>{val}</p>
                    })
                }
            </div>
        );
    }
}

export default New;

绑定this和传参

说明:jsx的点击事件是onClick,而且不能加(),这代表立即执行
import React, { Component } from 'react';

class New extends Component {
    constructor() {
        super()
        this.state = {
            msg: '元数据'
        }
        this.bindThis2 = this.bindThis2.bind(this)
    }
    test() {
        console.log("成功");
    }
    bindThis1() {
        console.log(this.state.msg);
    }
    bindThis2() {
        console.log(this.state.msg);
    }
    bindThis3 = () => {
        console.log(this.state.msg);
    }
    setStateInfo(info) {
        this.setState({
            msg: info
        })
    }
    render() {

        return (
            <div>
                {this.state.msg}
                <button onClick={this.test}>点击事件</button>
                <button onClick={this.bindThis1.bind(this)}>绑定this方式一</button>
                <button onClick={this.bindThis2}>绑定this方式二</button>
                <button onClick={this.bindThis3}>绑定this方式三</button>
                <button onClick={this.setStateInfo.bind(this,"修改的值")}>参数修改state值</button>
            </div>
        );
    }
}

export default New;

事件对象案例(获取数据的两种方式)

import React, { Component } from 'react';

class New extends Component {
    constructor() {
        super()
        this.state = {
            msg: ''
        }
    }
    test(event){
        // console.log(event);事件对象
        //获取自定义属性aid
        let aid=event.target.getAttribute('aid');
        console.log(aid);//123
    }
    inputChange=(event)=>{
        //获取数据的方式一
        // let value=event.target.value;
        //获取数据的方式二
        let value=this.refs.name.value;
        this.setState({
            msg:value
        })
    }
    showInfo=()=>{
        console.log(this.state.msg);
    }
    render() {
        return (
            <div>
               <button aid='123' onClick={this.test.bind(this)}>事件对象</button>
               <input type="text"  onChange={this.inputChange} ref='name'/>
                <input type="button" value="显示输入框的值" onClick={this.showInfo}/>
            </div>
        );
    }
}
export default New;

键盘事件

import React, { Component } from 'react';

class New extends Component {
    constructor() {
        super()
        this.state = {
            msg: ''
        }
    }
    
    onKeyUpChange=(event)=>{
        // console.log(event.keyCode);获取键盘事件码
        //enter事件
        if(event.keyCode==13){
            let value=event.target.value;
            this.setState({
                msg:value
            })
        }
    }
    render() {
        return (
            <div>
                <p>{this.state.msg}</p>
               <input type="text"  onKeyUp={this.onKeyUpChange} ref='name'/>
            </div>
        );
    }
}
export default New;

实现双向数据绑定

import React, { Component } from 'react';

class New extends Component {
    constructor() {
        super()
        this.state = {
            msg: ''
        }
    }
    
    inputChange=(e)=>{
        this.setState({
            msg:e.target.value
        })
    }
    render() {
        return (
            <div>
                <p>{this.state.msg}</p>
               <input type="text"  value={this.state.msg} onChange={this.inputChange}  />
            </div>
        );
    }
}
export default New;
说明:input绑定value时候必须加上onChange方法否则会报错,除非使用defaultValue
react中只有model改变影响view的单向数据流,所以如想实现双向数据绑定,必须手写
上面其实就是view改变改变model的过程代码
补充:
非约束型组件:例如非约束性组件中defaultValue就相当于原生dom的value,react不参与管理
约束型组件:例如非约束性组件中value,react参与管理(this.handleChange管理)
实际上,input中的value根本不是用户输入的值,而是onChange事件触发后,由于this.setState导致一次重新渲染,不过react会优化算法

表单相关

import React, { Component } from 'react';

class New extends Component {
    constructor() {
        super()
        this.state = {
            city:'',
            citys:["北京","上海"],
            sexs:[
                {key:"乒乓球",value:false},
                {key:"篮球",value:false},
                {key:"足球",value:true}
            ]
        }
    }
    submitMethod=(e)=>{
        //阻止默认事件
        e.preventDefault();
        console.log(this.state);
    }
    optionSet=(e)=>{
        this.setState({
            city:e.target.value
        })
    }
    sexsChange(index){
        //react接管了默认点击操作,如果布变更数据,则界面点击无效
        let sexs=this.state.sexs;
        sexs[index].value=!sexs[index].value;
        this.setState({
            sexs
        })
    }
    render() {
        return (
            <div>
                <p>{this.state.city}</p>
                <form>
                    <select value={this.state.city} onChange={this.optionSet}>
                    {
                        this.state.citys.map((value,index)=>{
                            return <option key={index}>{value}</option>
                        })
                    }
                    </select>
                    
                    {
                        this.state.sexs.map((value,index)=>{
                            return <span key={index}>
                                <input type="checkbox" onChange={this.sexsChange.bind(this,index)}  checked={value.value}/>{value.key}
                            </span>
                        })
                    }

                    <br/>
                    <input type="submit" value="提交" onClick={this.submitMethod}/>
                </form>
            </div>
        );
    }
}
export default New;

父子组件相关

父子组件互相传参

父组件:
import React, { Component } from 'react';
import Header from './Header'

class New extends Component {
    constructor(props) {
        super(props)
        this.state = {
           msg:"New传入的参数"
        }
    }
    show=()=>{
        console.log("被子组件调用的父组件的方法");
    }
    send2Parent=(info)=>{
        this.setState({
            msg:info
        })
    }
    getChildCom=()=>{
        //既然可以获取子组件,则属性方法自然都可以使用
        console.log(this.refs.header);
    }
    render() {
        return (
            <div>
                <p>{this.state.msg}</p>
                <input type="button" value="父组件获取子组件" onClick={this.getChildCom}/>
                <Header msg={this.state.msg} ref='header' new={this} method={this.show}/>
            </div>
        );
    }
}
export default New;

defaultProps和propTypes


  1. defaultProps:父子组件传值中,如果父组件调用子组件的时候不给子组件传值,则可以在
    子组件中使用defaultProps定义的默认值

  2. propTypes:验证父组件传值的类型合法性


子组件:
import React, { Component } from 'react';
//验证数据类型需要引入PropTypes
import PropTypes from 'prop-types';
class Header extends Component {
    showParent=()=>{
        console.log(this.props.new);
    }
    render() {
        return (
            <div>
                <p>{this.props.msg}</p>
                <button onClick={this.props.method}>调用父组件方法</button>
                <button onClick={this.showParent}>获取整个父组件</button>
                <button onClick={this.props.new.send2Parent.bind(this,"子组件传递的")}>子组件给父组件传值</button>
            </div>
        );
    }
}
//如果例如父组件没传入title则使用该默认值,否则使用父组件传值
//针对的是this.props.title是否传入
Header.defaultProps={
    title:"标题"
}
//验证数据类型,注意propTypes和PropTypes
Header.propTypes={
    title:PropTypes.string
}
export default Header;

生命周期


1.组件加载的时候触发的函数:

constructor(构造函数) componentWillMount(组件将要挂载) render(渲染) componentDidMount(组件挂载完毕)

2.组件更新的时候触发的函数:

shouldComponentUpdate(更新数据) ComponentWillUpdate(组件将要更新) render componentDidMount

2.1 补充

shouldComponentUpdate(nextProps,nextState){

比较props或者states,返回true则更新照常,返回false则取消更新,
且不会调用下面的两个生命周期函数

}

分别是更新后的父子组件的传递参数和更新后的state

使用场景:父组件有子组件A和子组件B,当父组件调用this.setState更新一个作为子组件A属性
的state时,render方法被再次调用,此时组件A和组件B同时被更新,其实真正改变的只有组件
A,但组件B也同时被要求更新了,这是没有必要的,于是shouldComponentUpdate就显的有用
了,在该函数体内比较props或是states,如果没有改变就取消这个更新,这对性能上算是一个提
升。因为传递过来到组件的都是更新过的,可以和该组件当前的prop和state比较,从而通过返回布尔值确定是否需要更新该组件

3.在父组件里面改变props传值的时候触发的函数:

componentWillReceiveProps

4.组件销毁的时候触发的函数:

componentWillUnmount

注意:绝对不要在componentWillUpdate和componentDidUpdate中调用this.setState方法,否则将导致无限循环调用。


组件销毁的案例:

父组件:
import React, { Component } from 'react';
import Header from './Header'

class New extends Component {
    constructor(props) {
        super(props)
        this.state = {
           msg:"参数",
           flag:true
        }
    }
    destoryChild=()=>{
        this.setState({
            flag:!this.state.flag
        })
    }
    render() {
        return (
            <div>
                <button onClick={this.destoryChild}>切换子组件</button>
                {
                    this.state.flag?<Header />:''
                }
            </div>
        );
    }
}
export default New;

子组件:
import React, { Component } from 'react';

class Header extends Component {
   
    render() {
        return (
            <div>
               <p>Header组件</p>
            </div>
        );
    }
    componentWillUnmount(){
        console.log("组件销毁");
    }
}
export default Header;
说明:每一次点击切换子组件都可以让子组件显示或者销毁,每次销毁时候触发子组件的componentWillUnmount
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 本文采用 es6 语法,完全参考 https://reactjs.org/docs/本文完全参考 React 官方...
    faremax阅读 10,186评论 1 7
  • Welcome to React! React是什么?为什么要使用它? React是Facebook内部的一个Ja...
    杀破狼real阅读 1,269评论 0 0
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,979评论 3 119
  • 我曾回去过思念中的家乡, 打着赤脚站在泥泞的小道; 坐在池塘边上等水鸭歌唱, 或是笑着挥动手臂一路小跑。 有时困倦...
    依然yiran06阅读 228评论 0 3
  • 事实证明,不努力,没有理想,没有追求的人,活的会很快乐,因为,他们会专注于眼前的快乐,不对未来有太多的期望,如果命...
    滕Elizabeth阅读 131评论 0 0