保安日记:React框架学习第二篇

Props

父传递给子组件数据,单向流动,不能子传递给父。

props的传值,可以是任意的类型。

Props可以设置默认值

HelloMessage.defaultProps = {  name:”老陈”,msg:“helloworld”  }

**注意:**props可以传递函数,props可以传递父元素的函数,就可以去修改父元素的state,从而达到传递数据给父元素。

父传子数据传递案例

class ParentNode extends React.Component{
    constructor(props){
        super(props)
        this.state ={
            isActive:true
        }
        this.changeShow=this.changeShow.bind(this)
    }

    render(){
        return(
            <div>
                <button onClick = {this.changeShow}>切换					</button>
                <ChildNode isActive = {this.state.isActive} />
            </div>
        )
    }
    changeShow(){
        this.setState ({
            isActive:!this.state.isActive
        })
    }
}

class ChildNode extends React.Component{
    constructor(props){
        super(props)
    }

    render(){
        let strClass = null
        strClass = this.props.isActive? 'active' :''
        return(
            <div className ={strClass}>
                <h1>我是子元素</h1>
            </div>
        )
    }
}

ReactDOM.render( <ParentNode />,
        document.querySelector("#root"))
React数据传递:子传父

调用父元素的函数从而操作父元素的数据,从而实现数据从子元素传递至父元素


class ParentNode extends React.Component{
    constructor(props){
        super(props)
        this.state ={
            childData:''
        }
    }

    render(){
        return(
            <div>
                <h1>子传父的数据 {this.state.childData}</h1>
                <ChildNode setChildData ={this.setChildData} />  
            </div>
            
        )
    }
    setChildData =(data)=>{
        this.setState({
            childData:data
        })
    }
}

class ChildNode extends React.Component{
    constructor(props){
        super(props)
        this.state ={
            msg:'hello,world'
        }
        // this.sendData = this.sendData.bind(this)
    }

    render(){
        return(
           <div>
               <button onClick={this.sendData}>传递参数					   </button>
           </div>
        )
    }
    sendData =()=>{
        // 将子元素传递给父元素,实际就是调用父元素传递进来的父元素函数
        this.props.setChildData(this.state.msg)
    }
}

ReactDOM.render( <ParentNode />,
        document.querySelector("#root"))

React 事件

事件对象:React返回的事件对象是代理的原生的事件对象,如果想要查看事件对象的具体值,必须之间输出事件对象的属性。

注意:

原生,阻止默认行为时,可以直接返回return false;

React中,阻止默认必须e.preventDefault();

class ParentNode extends Component{
    constructor(props){
        super(props)
    }

    render(){
        return(
            <div>
                <form action="http://www.baidu.com">
                    <button onClick={this.preventEvent}></button>
                </form>
            </div>
        )
    }
    preventEvent=(e)=>{
        //return false ---不能阻止页面跳转
        e.preventDefault()
    }
}
React事件传参数
 {/* 使用ES6箭头函数传递多个参数 */}
                    <button  onClick={(e)=>{this.parentEvent1('msg:helloworld',e)}}>
                        提交
                    </button>
                    {/* //不使用ES6箭头函数传递多个参数的方式 */}
                    <button  onClick={function(e){this.parentEvent1('不使用es6,msg:helloworld',e)}.bind(this)}>
                        提交
                    </button>

React 条件渲染

React中条件渲染即和JavaScript中,条件运算,如if…else…三元运算符等。

  1. 直接通过条件运算返回要渲染的JSX对象

  2. 通过条件运算得出jsx对象,在将JSX对象渲染到模板中。

案例一:

import React from 'react';
import ReactDOM from 'react-dom';

function UserGreet(props){
    return (<h1>欢迎登陆</h1>)
}

function UserLogin(props){
    return (<h1>请先登录</h1>)
}

class ParentCom extends React.Component{
    constructor(props){
        super(props)
        this.state = {
            isLogin:false
        }
    }
    render(){
        let element = null;
        if(this.state.isLogin){
            element = <UserGreet></UserGreet>;
        }else{
            element = (<UserLogin></UserLogin>);
        }

        

        return (
            <div>
                <h1>这是头部</h1>
                {element}
                <h1>这是三元运算符的操作</h1>
                {this.state.isLogin?<UserGreet></UserGreet>:<UserLogin></UserLogin>}
                <h1>这是尾部</h1>
            </div>
        )
    }
}

ReactDOM.render(
    <ParentCom></ParentCom>,
    document.querySelector('#root')
)

React 列表渲染

将列表内容拼装成数组放置到模板中。将数据拼装成数组的JSX对象。

使用数组的map方法,对每一项数据按照JSX的形式进行加工,最终得到1个每一项都是JSX对象的数组,在将数组渲染到模板中。

Key值需要放置到每一项中

import React, { Component } from 'react';
import ReactDOM from 'react-dom';

function ListItem(props){
    return(
        <li >
                    <h3>{props.index+1}:{props.data.title}</h3>
                    <p>{props.data.content}</p>
        </li>
    )
}
class ListItem2 extends Component{
    constructor(props){
        super(props)
    }

    render(){
        return(
            <li onClick={(e)=>{this.clickEvent(
                this.props.index,
                this.props.data.title,
                e)}}>
                <h3>{this.props.index+1}:{this.props.data.title}</h3>
                <p>{this.props.data.content}</p>
            </li>
        )
    }
    clickEvent = (index,title,event)=>{
        alert((index+1)+' & '+title)
    }
}

class Welcome extends React.Component{
    constructor(props){
        super(props)
        this.state = {
            list:[
                {
                    title:"第一节 React事件",
                    content:"事件内容"
                },
                {
                    title:"第二节 React数据传递",
                    content:"数据传递内容",
                },
                {
                    title:"第三节 条件渲染",
                    content:"条件渲染内容",
                }
            ]
        }
    }

    render(){
        let listArr = this.state.list.map((item,index)=>{
            return(
                <ListItem2 key={index} data={item} index={index}></ListItem2>
                
            )
        })
        console.log(listArr);

        return (
            <div>
                <h1>
                    今天课程内容
                </h1>

                <ul>
                    {listArr}
                    <li>
                        <h3>这是标题</h3>
                        <p>内容</p>
                    </li>
                </ul>

            </div>
        )
    }
}

ReactDOM.render(
    <Welcome></Welcome>,
    document.querySelector('#root')
)
//疫情数据集合
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import jsonData from './feiyan.json'
import './App.css'

let provincesObj = {}

jsonData.data.list.forEach((item,i)=>{
    if(provincesObj[item.province] == undefined){
        provincesObj[item.province] ={
            confirm:0 ,
            heal:0,
            dead:0
        }
    }
    item.confirm = item.confirm?item.confirm:0;
    item.heal = item.heal?item.heal:0;
    item.dead = item.dead?item.dead:0;

    provincesObj[item.province] = {
        confirm:provincesObj[item.province].confirm + item.confirm,
        heal:provincesObj[item.province].heal + item.heal,
        dead:provincesObj[item.province].dead + item.dead
    }
})
// console.log(provincesObj);
let provinceList = [];
for (const key in provincesObj) {
    provincesObj[key].province = key
    provinceList.push (provincesObj[key])
}
console.log(provinceList);

//排序 sort 如果返回值大于0 则调换位置 如果小于0则不变
let provinceListSort = provinceList.sort((a,b)=>{
    if(a.confirm < b.confirm){
        return 1
    }else{
        return -1
    }
})
console.log(provinceListSort);

class Bingli extends React.Component{
    constructor(props){
        super(props)
    }

    render(){
        return(
            <div>
                <ul>
                    <li>
                        <span>省份</span>
                        <span>确诊</span>
                        <span>治愈</span>
                        <span>死亡</span>
                    </li>

                    {
                        this.props.list.map((item,index)=>{
                            return(
                                <li>
                                    <span>{item.province}</span>
                                    <span>{item.confirm}</span> 
                                    <span>{item.heal}</span> 
                                    <span>{item.dead}</span>
                                </li>
                            )
                        })
                    }
                </ul>
            </div>
        )
    }
}
ReactDOM.render(<Bingli list={provinceListSort}></Bingli>,document.querySelector('#root'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值