react

作者: 他在发呆 | 来源:发表于2016-12-24 16:48 被阅读0次

    react 用于构建用户界面的javascript;

    (npm start)

    首先需要引入三个js文件

    基本语法

    由于使用了jsx语法(javascript+Xml,browser.js提供),所以script的type值如下:

    <script type="text/babel"></script>
    

    Xml一般用来做数据保存
    react-dom.js提供了一个方法,ReactDOM

    ReactDOM.render(<h1>hello react</h1>,document.getElementById('container'))
    

    第一个参数是要渲染的内容,第二个参数是要时使用的容器

    如果第一个参数内容较多的话,可以赋给一个变量,

    let h1=<h1>hello react</h1>,
    ReactDOM.render(h1,document.getElementById('container'))
    

    自定义组件,createClass方法
    需要拿一个变量接受返回值,变量首字母必须要大写

        let Wumai=React.createClass({
            render(){
                return <div>雾霾走了,天气好了</div>
            }
        })
    

    自定义组件引入时,要写成一个单标签的形式

    ReactDOM.render(<Wumai/>,document.getElementById('container'))
    

    若想要在里面插入内容,可以写成双标签,把内容放在双标签里面;如想要传参进去,如<Wumai count={10} />的形式;
    如果觉得麻烦的话,要是用变量的形式

    let wumai=<Wumai/>
    ReactDOM.render(wumai,document.getElementById('container'))
    

    可以把容器提前获取出来

    let container=document.getElementById('container');
    

    在react中,要实现angular的ng-transclude类似功能,直接放到标签里面就可以了

        let SmallBox=React.createClass({
            render(){//可以把渲染内容放到一个小括号里面
                return (
                        <div>这是一个小盒子</div>
                    )
            }
        })
        let BigBox=React.createClass({
            render(){
                return (
                    <div>
                        <h1>这是大盒子</h1>
                        <SmallBox/>
                        <SmallBox/>
                    </div>
                )
            }
        })
        ReactDOM.render(<BigBox />,container)
    
    • 列表的渲染
        let List=React.createClass({
            render(){
                let list=[
                    <h3 key={'a'}>小明</h3>,
                    <h3 key={2}>小红</h3>,
                    <h3 key={3}>小猪</h3>
                ]
    
                return (
                    <div>
                        <h1>列表渲染</h1>
                        {list}
                    </div>
                )
            }
        })
        ReactDOM.render(<List/>,document.getElementById('container'))
    

    数组渲染时,每个数组需要一个key;
    这是一个数组,不要忘记加逗号,并且key值不可以重复,若里面是对象,先用for循环遍历,把它切换成这样的类型;或使用map方法遍历

    react-template

    安装react-template
    进入react-template文件夹
    npm start 默认启动8080端口,在浏览器打开http://localhost:8080

    把要写的页面都放在app/components下,同App同级;
    在里面自定义文件demo1.js,

    import React,{Component} from 'react';
    export default class extends Compinent{
        render () {
            let list=[
                <h1>小明</h1>,
                <h1>小明</h1>,
                <h1>小明</h1>
            ]
            return (
                <div>{list}</div>
            )
        }
    }
    

    在main.js文件中导入

    import demo1 from './components/demo1'
    
    render(<demo1/>, document.getElementById('root'))
    
    
    • 引入css样式

    导入外部样式表
    新建一个css文件,在compponents文件夹下:

    .container{
        width:400px;
        height:250px;
        background-color:#afa;
    }
    

    在demo.js中

    import Styles from './demo.css';
    
    exprot default class extends Component{
        render (){
            return (
                <div className={Styles.container}></div>
            )
        }
    }
    

    使用内部样式表
    在demo.js中

    let StyleSheet={
        title:{
            fontSize:24,
            color:'green'
        }
    }
    要用驼峰命名法,且不加单位
    

    使用:

    exprot default class extends Component{
        render (){
            return (
                <div className={Styles.container}>
                    <h1 style={StyleSheet.title}>hello</h1>
    
                    //附带一个行内样式
                    <h3 style={{color:'blue'}}>react</h3>
                </div>
            )
        }
    }
    //自定义行内属性用{{}}:外层大括号用来输出,里层大括号是一个对象
    
    • 传参
    class Header extends Component{
        render(){
            return (
                <div>你好{this.props.title}</div>
            )
        }
    }
    <Header title="小明" />
    

    通过this.props获取参数
    这样可以传参,但是有一个缺陷
    props是固定不变的,要想传一个变量,就用到state;

    下面重新写一个demo.js

    export default class exrends Component{
        
        constructor(props){
            //构造函数调用
            super(props);
            this.state:0
        }
    
        componentDidMount(){
            //这个方法会在组件加载成功之后调用
            //写一个定时器,让count持续++;
            //这里的类是_class;
            let self=this;
            setInterval(function(){
                //这里的this就是window
                self.state.count++;
                console.log(self.state.count);
                //这样是不行的,这里不允许直接操作state,提供了一个方法
                self.setState({
                    count:self.state.count++;
                })
            })
        }
        render(){
            //渲染
            return (
                <div>
                    <div>{this.state.count}</div>
                </div>
            )   
        }
    }
    

    如果想要改变this的指向,有两种方法:
    1用一个变量在外面就收this
    2在函数后面加bind
    setInterval(function(){
    this//这样,里面的this就和外面的this一致了
    }.bind(this),1000)

    把上面的demo数据换成对象形式:

    export default class extends Component{
        constructor (props){
            super(props);
            this.state={
                data:[
                    {name:'小明',id:0},
                    {name:'小红',id:1}
                ],
                renderData:[]//用来接收转换之后的数据
            }
        }
        componentDidMount(){
            let data=this.state.data;
            let newdata=[];
            for(let i=0;i<data.length;i++){
                let name=data[i].name;
                let id=data[i].id;
                let comp=<div key={id}>{name}</div>
                newdata.push(comp);
            }
            this.setState({
                renderData:newdata
            })
        }
        render(){
            return (
                <div>
                    <h1>列表渲染</h1>
                    <div>{this.state.renderData}</div>
                </div>
            )
        }
    }
    

    就上面的demo,改变componentDidMount中的for循环,使用map方法

    componentDidMount(){
        let data=this.state.data;
        let newdata=[];
        data.map(function(item){
            console.log(item);//遍历数组中的每一条元素
            return (<div key={item.id}>{item.name}</div>)
        })
        this.setState({
            renderData:newdata
        })
    }
    
    
    • 使用网络请求:

    1.可以使用原生的ajax封装的方法;
    2.也可以使用jq封装的方法;
    3.还可以使用fetch方法,在GitHub上有

    npm install whatwg-fetch --save
    cd whatwg-fetch
    import 'whatwg-fetch'

    使用:
    fetch(url).then(function(res){
        return res.json()//类似于JSON.parse
    }).then(function(res){
        console.log(res);
    })
    
    

    路由
    写到main.js中

    import {Router,Route,IndexRoute,Link,hashHistory,IndexLink,browserHistory} from 'react-router'
    
    hashHistory与browserHistory的区别:
    跳转时url是否显示#
    
    const ACTIVE={color:'red'}//选中的样式
    
    let App=({children})=>(
        <div>
            <h1>APP</h1>
            <ul>
                <li><Link  to="/home"  activeStyle={ACTIVE}>home</Link></li>
                <li><Link  to="/list"  activeStyle={ACTIVE}>list</Link></li>
            </ul>
            {children}
        </div>
    )
    let Home=()=>(
        <div>
            <h1>这是home页面</h1>
        </div>
    )
    let List=()=>(
        <div>
            <h1>这是list页面</h1>
        </div>
    )
    
    编辑路由
    let router=(<Router history={hashHistory})>
        <Router path="/" component={App}>
            <IndexRouter component={Home}/>//默认显示页面
            <Route path="/home" component={Home}/>
            如果有子路由的话,把单标签改为双标签,把子路由插进去
            <Route path="/list" component={List}>
                <IndexRouter component={One}/>
                <Route path="/list/one" component={One}/>
            </Route>
        </Router>
    </Router>)
    
    
    

    相关文章

      网友评论

          本文标题:react

          本文链接:https://www.haomeiwen.com/subject/qhzlvttx.html