本文主要讲解在react组件中如何绑定数据,绑定属性,引入图片,以及如何循环数据。

一、react如何绑定数据

在模板中(render函数返回的jsx部分)中,用{}来进行数据绑定:

import React from 'react';

class Home extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            name: "react",
            info: {
                type: "js component",
                componentName: "Home"
            }
        }
    }
    render(){
        let test = "这是一个测试"
        return (
            <div>
                <div>
                I am {this.state.name} component {this.state.info.componentName}.
                </div>
                <br />
                <div>
                    {test}
                </div>
            </div>
        )
    }
}

export default Home;

react yarn命令_react

二、绑定属性

在react中,绑定属性和普通html有三点不同:

  • class 要变成 className
  • for 要变成 htmlFor
  • style属性是花括号里面放一个对象
  • 其它属性和html用法一致
2.1 class 要变成 className
render(){
        let test = "这是一个测试"
        return (
            <div>
                <div>
                I am {this.state.name} component {this.state.info.componentName}.
                </div>
                <br />
                <div>
                    {test}
                </div>
                <br />
                <div className='redTitle'>
                    这是一段红色的文字
                </div>
            </div>
        )
    }

react yarn命令_html_02


如果写成class看一下会是什么效果:

<div class='redTitle'>
                    这是一段红色的文字
                </div>

react yarn命令_网络图片_03


可以看到虽然页面正常显示,但是控制台会在报错。这个地方是因为class是es6的一个关键字,所以要用className来代替class。

2.2 for 要变成 htmlFor
render(){
        let test = "这是一个测试"
        return (
            <div>
                <div>
                I am {this.state.name} component {this.state.info.componentName}.
                </div>
                <br />
                <div>
                    {test}
                </div>
                <br />
                <div class='redTitle'>
                    这是一段红色的文字
                </div>
                <br />
                <label htmlFor="name">姓名</label>
                <input id="name"  />
            </div>
        )
    }

react yarn命令_html_04


如果任然用for,看一下会发生什么:

<label for="name">姓名</label>
                <input id="name"  />

react yarn命令_数据_05


发现和className类似,页面显示正常,但是控制台会报错。

2.3 style属性是花括号里面放一个对象

在这个地方,可以直接写一个对象,也可以用变量定义一个对象:

render(){
        let test = "这是一个测试"
        let style = {
            color: "red"
        };

        return (
            <div>
                <div>
                I am {this.state.name} component {this.state.info.componentName}.
                </div>
                <br />
                <div>
                    {test}
                </div>
                <br />
                <div className='redTitle'>
                    这是一段红色的文字
                </div>
                <br />
                <label htmlFor="name">姓名</label>
                <input id="name"  />
                <br />      
                <div style={{'color': 'red'}}>
                    这是style的样式1
                </div>     
                <br />      
                <div style={style}>
                    这是style的样式2
                </div>  
            
            </div>
        )
    }

react yarn命令_react yarn命令_06

三、导入图片

先使用html中方法尝试一下:

<img src='./../assets/images/test.jpg' />

react yarn命令_数据_07


可以看到图片并没有显示出来。

3.1 用import的方式引入本地图片

可以先把需要的图片import进来,然后在使用的地方直接引用就可以:

import testJpg from './../assets/images/test.jpg';
<img src={testJpg} />

react yarn命令_react_08

3.2 用require引用本地图片

想到import,肯定会想到和import齐名的require,它俩的区别可以查看:js之旅(十)import/export和require/module.exports(exports),用法如下:

<img src={require('./../assets/images/test.jpg')} />

react yarn命令_react yarn命令_09

3.3 引用网络图片

网络图片是指有完整的域名的图片,如:http://www.baidu.com/img/flexible/logo/pc/result.png
引用这类图片,直接使用html中的方式即可:

<img src ='http://www.baidu.com/img/flexible/logo/pc/result.png'/>

react yarn命令_网络图片_10

四、循环数据

可以使用map来实现数据的循环,返回jsx语法即可:

<ul>
                    {
                        this.state.data.map((v, k) => {
                            return (
                                <li>
                                    {v.title}
                                </li>
                            )
                        })
                    }
                </ul>

react yarn命令_html_11


看到控制台报了一个错误:Each child in a list should have a unique "key" prop,造成这个错误的原因是:

react的key关乎到react的dom-diff算法 react中对于dom的操作是根据生成的data-reactid进行绑定的,添加key可以保证dom结构的完整性,而不会根据react自己对dom标记的key进行重新分配 react每次决定重新渲染的时候,几乎完全是根据data-reactid来决定的,最重要的是这个机制

解决方法也很简单:在循环的每个子项添加一个key就行了

<ul>
                    {
                        this.state.data.map((v, k) => {
                            return (
                                <li key={k}>
                                    {v.title}
                                </li>
                            )
                        })
                    }
                </ul>

五、本文完整代码

import React from 'react';
import testJpg from './../assets/images/test.jpg';

class Home extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            name: "react",
            info: {
                type: "js component",
                componentName: "Home"
            },
            data: [
                {
                    id: 1,
                    title: "title1"
                },
                {
                    id: 2,
                    title: "title2"
                }
            ]
        }
    }
    
    render(){
        let test = "这是一个测试"
        let style = {
            color: "red"
        };

        return (
            <div>
                <div>
                I am {this.state.name} component {this.state.info.componentName}.
                </div>
                <br />
                <div>
                    {test}
                </div>
                <br />
                <div className='redTitle'>
                    这是一段红色的文字
                </div>
                <br />
                <label htmlFor="name">姓名</label>
                <input id="name"  />
                <br />      
                <div style={{'color': 'red'}}>
                    这是style的样式1
                </div>     
                <br />      
                <div style={style}>
                    这是style的样式2
                </div>  
                <br/>
                <img src='./../assets/images/test.jpg' />
                <img src={testJpg} />
                <img src={require('./../assets/images/test.jpg')} />
                <img src ='http://www.baidu.com/img/flexible/logo/pc/result.png'/>
                <br /><br /><br /><br /><br /><br />
                <ul>
                    {
                        this.state.data.map((v, k) => {
                            return (
                                <li key={k}>
                                    {v.title}
                                </li>
                            )
                        })
                    }
                </ul>
            </div>
        )
    }
}

export default Home;