React 组件传值(Props&&State)

上一篇说了cli环境安装这篇说组件传值 此文参考

  • state 和 props 主要的区别在于 props 是不可变的,而 state 可以根据与用户交互来改变。这就是为什么有些容器组件需要定义 state 来更新和修改数据。 而子组件只能通过 props 来传递数据。
如果按照之前的文章来看的应该是这个样子

关于React的一个重大交易是它如何处理数据,它使用 属性(称为props)state来实现;

  • 父子组件传值 (Props)
    我们将tb数据 组成数组对象由父组件=>App.js传递到Table.js ,现在我们将Table.js整理下
//App.js 
//必须在App内部创建这个数组 "render()"
render(){
    const characters = [
        {
            name: 'Charlie',
            job: 'Janitor',
        },
        {
            name: 'Mac',
            job: 'Bouncer',
        },
        {
            name: 'Dee',
            job: 'Aspring actress',
        },
        {
            name: 'Dennis',
            job: 'Bartender',
        },
    ]
    

    
    return(
        <div className="container">
            <Table characterData={ characters }  />
            <Time />
        </div>
    )
    
}
//Table.js:
 //提取组件 将table组件提取成 Header Body两个小组件
const TableHeader = () => {
  return (
    <thead>
      <tr>
        <th>Name</th>
        <th>Job</th>
      </tr>
    </thead>
  )
}
const TableBody = props=> {
  const rows=props.characterData.map((item,i)=>{ // 映射
    
    return (
      <tr key={i}>
        <td>{item.name}</td>
        <td>{item.job}</td>
      </tr>
    )

  })

  return <tbody>{rows}</tbody>
}
class Table extends Component { 
  // 类组件必须包含render(),并且return只能返回一个父元素。
  render() {

    const { characterData}=this.props // 父组件传递的值

    return (
      <table>
        <TableHeader/>
        <TableBody characterData={characterData} />
      </table>
    )
    // 如果return包含在一行中,则不需要括号。
  }
}

tips:数组对象需要在App组件里建立 JavaScript Map es6 此时应该跟上篇显示效果是一样的


  • 现在我们来实现一个时钟显示的功能小组件:
每秒更新一次
  • 思路显示初始值=>构造函数=>每隔1s执行一次并渲染到ui

定义一个Time组件方便之后使用 (组件命名规则首字母大写,属性:小驼峰)

//App.js:
const Time=()=>{
    return <h3>{new Date().toLocaleTimeString()}</h3>
}
//App组件内部
<div className="container">
      <Table characterData={ characters } removeCharacter={this.removeCharacter} />
      <Time />
</div>

  • toLocaleTimeString:可根据本地时间把 Date 对象的时间部分转换为字符串,并返回结果。
  • React 非常灵活,但它也有一个严格的规则:所有 React 组件都必须像纯函数一样保护它们的 props 不被更改。这时候我们使用state,在不违反上述规则的情况下,state 允许 React 组件随用户操作、网络响应或者其他变化而动态更改输出内容。
// 将Time修改
class Time extends Component{
    constructor(props) { //构造函数  将props 传递到父类的构造函数中
        super(props);
        this.state={time:new Date()} // 给state赋值
    }

    render(){
        return <h3>{this.state.time.toLocaleTimeString()}</h3>
    }

}

  • constructor:是一种用于创建和初始化创建的对象的特殊方法 查看具体请点击
  • 现在需要在组件挂载时开始每秒渲染 实现 时钟。这就需要使用到 生命周期:componentDidMount(挂载) , componentWillUnmount(卸载)
componentDidMount() { // 挂载
      this.TimeId=setInterval(()=>{
            this.tick()
        },1000);// 每秒执行一次
  }
  
   componentWillUnmount() { // 卸载
        clearInterval(this.timerID); //清除
    }
    tick() { // 赋值time
        this.setState({
            time: new Date()
        });
    }


全部代码:

class Time extends Component{
    constructor(props) { //构造函数
        super(props);
        this.state={time:new Date()}
    }
    componentDidMount() { // 挂载
        this.TimeId=setInterval(()=>{
            this.tick()
        },1000);// 每秒执行一次
    }
  
    componentWillUnmount() { // 卸载
        clearInterval(this.timerID); //清除
    }
    tick() { // 赋值time
        this.setState({
            time: new Date()
        });
    }
    

    render(){
        return <h3>{this.state.time.toLocaleTimeString()}</h3>
    }

}
//App 组件的 return部分
return(
 <div className="container">
      <Table characterData={ characters }/>
      <Time />
 </div>
)

对表格行进行操作 也就是上面显示的 Delete按钮的图片

  • 首先将样子搭出来 修改下 Table.js 中 headerbody组件
//TableHeader
<thead>
  <tr>
    <th>Name</th>
    <th>Job</th>
    <th>Remove</th> // 添加标题
  </tr>
</thead>
// TableBody  添加一个button按钮 触发删除事件 事件由 父组件传递过来
<tr key={i}>
  <td>{item.name}</td>
  <td>{item.job}</td>
  <td>
    <button onClick={()=>{props.removeCharacter(i)}}>Delete</button>
  </td>
</tr>
// table
<TableBody characterData={characterData} removeCharacter={removeCharacter}/>

tips: 为每个表行添加了一个键索引,有助于识别每个列表项。该onClick函数必须通过一个返回该removeCharacter()方法的函数,否则它将尝试自动运行。

  • 现在显示没问题了 开始做数据处理
    characters存在state里:
  state = {
        characters:[
            {
                name: 'Charlie',
                job: 'Janitor',
            },
            {
                name: 'Mac',
                job: 'Bouncer',
            },
            {
                name: 'Dee',
                job: 'Aspring actress',
            },
            {
                name: 'Dennis',
                job: 'Bartender',
            },
        ],
    }

删除数组项:removeCharacterApp类上创建一个方法:

// 删除 某个数据
    removeCharacter = index => {
        const { characters } = this.state // 读取当前的数据
        this.setState({
            characters: characters.filter((character, i) => {
                return i !== index // 对数组筛选 并返回符合项
            }),
        })
    }

tips:filter不改变原数组而是创建一个新数组,并且是在JavaScript中修改数组的首选方法。这个特殊的方法是测试一个索引与数组中的所有索引,并返回除了传递的所有索引之外的所有索引Filter 链接;在App render 时不要忘记 提取数据 const { characters} = this.staterender(){} 添加。

全部代码 包含之前的

//App.js:
import React,{Component} from 'react';
import Table from './Table';

class Time extends Component{
    constructor(props) { //构造函数
        super(props);
        this.state={time:new Date()}
    }
    componentDidMount() { // 挂载
        this.TimeId=setInterval(()=>{
            this.tick()
        },1000);// 每秒执行一次
    }
  
    componentWillUnmount() { // 卸载
        clearInterval(this.timerID); //清除
    }
    tick() { // 赋值time
        this.setState({
            time: new Date()
        });
    }
    

    render(){
        return <h3>{this.state.time.toLocaleTimeString()}</h3>
    }

}

class App extends Component{

    // state

    state = {
        characters:[
            {
                name: 'Charlie',
                job: 'Janitor',
            },
            {
                name: 'Mac',
                job: 'Bouncer',
            },
            {
                name: 'Dee',
                job: 'Aspring actress',
            },
            {
                name: 'Dennis',
                job: 'Bartender',
            },
        ],
    }

    // 删除 某个数据
    removeCharacter = index => {
        const { characters } = this.state
        this.setState({
            characters: characters.filter((character, i) => {
                return i !== index
            }),
        })
    }

    render(){
        const { characters} = this.state
        // const characters = [
        //     {
        //       name: 'Charlie',
        //       job: 'Janitor',
        //     },
        //     {
        //       name: 'Mac',
        //       job: 'Bouncer',
        //     },
        //     {
        //       name: 'Dee',
        //       job: 'Aspring actress',
        //     },
        //     {
        //       name: 'Dennis',
        //       job: 'Bartender',
        //     },
        // ]
        

        
        return(
            <div className="container">
                <Table characterData={ characters } removeCharacter={this.removeCharacter} />
                <Time />
            </div>
        )
        
    }
}

export default App

//Table.js
import React, { Component } from 'react'

const TableHeader = () => {
  return (
    <thead>
      <tr>
        <th>Name</th>
        <th>Job</th>
        <th>Remove</th>
      </tr>
    </thead>
  )
}
const TableBody = props=> {
  const rows=props.characterData.map((item,i)=>{
    
    return (
      <tr key={i}>
        <td>{item.name}</td>
        <td>{item.job}</td>
        <td>
          <button onClick={()=>{props.removeCharacter(i)}}>Delete</button>
        </td>
      </tr>
    )

  })

  return <tbody>{rows}</tbody>
}

// [[1, 2], [3, 4]].map(([a, b]) =>{
//   console.log(a)
//   console.log(b)
//   return a + b
// });

class Table extends Component { 
  // 类组件必须包含render(),并且return只能返回一个父元素。
  render() {

    const { characterData , removeCharacter}=this.props

    return (
      <table>
        <TableHeader/>
        <TableBody characterData={characterData} removeCharacter={removeCharacter}/>
      </table>
    )
    // 如果return包含在一行中,则不需要括号。
  }
}

export default Table

如果中间执行有问题的话 多看看 代码 整理下,不是很难。也可以跟我联系沟通


javaScript 教程

React 小册

React文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,410评论 1 33
  • HTML模版 之后出现的React代码嵌套入模版中。 1. Hello world 这段代码将一个一级标题插入到指...
    ryanho84阅读 6,213评论 0 9
  • 最近看了一本关于学习方法论的书,强调了记笔记和坚持的重要性。这几天也刚好在学习React,所以我打算每天坚持一篇R...
    gaoer1938阅读 1,662评论 0 5
  • 1、什么是react React.js 是一个帮助你构建页面 UI 的库。React.js 将帮助我们将界面分成了...
    谷子多阅读 2,553评论 1 13
  • 以下内容是我在学习和研究React时,对React的特性、重点和注意事项的提取、精练和总结,可以做为React特性...
    科研者阅读 8,210评论 2 21