React 組件傳值(Props&&State)

上一篇說了cli環(huán)境安裝這篇說組件傳值 此文參考

  • state 和 props 主要的區(qū)別在于 props 是不可變的衅鹿,而 state 可以根據(jù)與用戶交互來改變愕够。這就是為什么有些容器組件需要定義 state 來更新和修改數(shù)據(jù)。 而子組件只能通過 props 來傳遞數(shù)據(jù)浪讳。
如果按照之前的文章來看的應(yīng)該是這個樣子

關(guān)于React的一個重大交易是它如何處理數(shù)據(jù)缰盏,它使用 屬性(稱為props)state來實現(xiàn);

  • 父子組件傳值 (Props)
    我們將tb數(shù)據(jù) 組成數(shù)組對象由父組件=>App.js傳遞到Table.js ,現(xiàn)在我們將Table.js整理下
//App.js 
//必須在App內(nèi)部創(chuàng)建這個數(shù)組 "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:數(shù)組對象需要在App組件里建立 JavaScript Map es6 此時應(yīng)該跟上篇顯示效果是一樣的


  • 現(xiàn)在我們來實現(xiàn)一個時鐘顯示的功能小組件:
每秒更新一次
  • 思路顯示初始值=>構(gòu)造函數(shù)=>每隔1s執(zhí)行一次并渲染到ui

定義一個Time組件方便之后使用 (組件命名規(guī)則首字母大寫济炎,屬性:小駝峰)

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

  • toLocaleTimeString:可根據(jù)本地時間把 Date 對象的時間部分轉(zhuǎn)換為字符串,并返回結(jié)果辐真。
  • React 非常靈活须尚,但它也有一個嚴格的規(guī)則:所有 React 組件都必須像純函數(shù)一樣保護它們的 props 不被更改。這時候我們使用state,在不違反上述規(guī)則的情況下侍咱,state 允許 React 組件隨用戶操作耐床、網(wǎng)絡(luò)響應(yīng)或者其他變化而動態(tài)更改輸出內(nèi)容。
// 將Time修改
class Time extends Component{
    constructor(props) { //構(gòu)造函數(shù)  將props 傳遞到父類的構(gòu)造函數(shù)中
        super(props);
        this.state={time:new Date()} // 給state賦值
    }

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

}

  • constructor:是一種用于創(chuàng)建和初始化創(chuàng)建的對象的特殊方法 查看具體請點擊
  • 現(xiàn)在需要在組件掛載時開始每秒渲染 實現(xiàn) 時鐘楔脯。這就需要使用到 生命周期:componentDidMount(掛載) , componentWillUnmount(卸載)
componentDidMount() { // 掛載
      this.TimeId=setInterval(()=>{
            this.tick()
        },1000);// 每秒執(zhí)行一次
  }
  
   componentWillUnmount() { // 卸載
        clearInterval(this.timerID); //清除
    }
    tick() { // 賦值time
        this.setState({
            time: new Date()
        });
    }


全部代碼:

class Time extends Component{
    constructor(props) { //構(gòu)造函數(shù)
        super(props);
        this.state={time:new Date()}
    }
    componentDidMount() { // 掛載
        this.TimeId=setInterval(()=>{
            this.tick()
        },1000);// 每秒執(zhí)行一次
    }
  
    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按鈕 觸發(fā)刪除事件 事件由 父組件傳遞過來
<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函數(shù)必須通過一個返回該removeCharacter()方法的函數(shù),否則它將嘗試自動運行昧廷。

  • 現(xiàn)在顯示沒問題了 開始做數(shù)據(jù)處理
    characters存在state里:
  state = {
        characters:[
            {
                name: 'Charlie',
                job: 'Janitor',
            },
            {
                name: 'Mac',
                job: 'Bouncer',
            },
            {
                name: 'Dee',
                job: 'Aspring actress',
            },
            {
                name: 'Dennis',
                job: 'Bartender',
            },
        ],
    }

刪除數(shù)組項:removeCharacterApp類上創(chuàng)建一個方法:

// 刪除 某個數(shù)據(jù)
    removeCharacter = index => {
        const { characters } = this.state // 讀取當前的數(shù)據(jù)
        this.setState({
            characters: characters.filter((character, i) => {
                return i !== index // 對數(shù)組篩選 并返回符合項
            }),
        })
    }

tips:filter不改變原數(shù)組而是創(chuàng)建一個新數(shù)組堪嫂,并且是在JavaScript中修改數(shù)組的首選方法。這個特殊的方法是測試一個索引與數(shù)組中的所有索引麸粮,并返回除了傳遞的所有索引之外的所有索引Filter 鏈接溉苛;在App render 時不要忘記 提取數(shù)據(jù) const { characters} = this.staterender(){} 添加。

全部代碼 包含之前的

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

class Time extends Component{
    constructor(props) { //構(gòu)造函數(shù)
        super(props);
        this.state={time:new Date()}
    }
    componentDidMount() { // 掛載
        this.TimeId=setInterval(()=>{
            this.tick()
        },1000);// 每秒執(zhí)行一次
    }
  
    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',
            },
        ],
    }

    // 刪除 某個數(shù)據(jù)
    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

如果中間執(zhí)行有問題的話 多看看 代碼 整理下寂玲,不是很難。也可以跟我聯(lián)系溝通


javaScript 教程

React 小冊

React文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梗摇,一起剝皮案震驚了整個濱河市拓哟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伶授,老刑警劉巖断序,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件流纹,死亡現(xiàn)場離奇詭異,居然都是意外死亡违诗,警方通過查閱死者的電腦和手機漱凝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诸迟,“玉大人茸炒,你說我怎么就攤上這事≌笪” “怎么了壁公?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绅项。 經(jīng)常有香客問我紊册,道長,這世上最難降的妖魔是什么趁怔? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任湿硝,我火速辦了婚禮,結(jié)果婚禮上润努,老公的妹妹穿的比我還像新娘关斜。我一直安慰自己,他們只是感情好铺浇,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布痢畜。 她就那樣靜靜地躺著,像睡著了一般鳍侣。 火紅的嫁衣襯著肌膚如雪丁稀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天倚聚,我揣著相機與錄音线衫,去河邊找鬼。 笑死惑折,一個胖子當著我的面吹牛授账,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惨驶,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼白热,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了粗卜?” 一聲冷哼從身側(cè)響起屋确,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后攻臀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焕数,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年茵烈,在試婚紗的時候發(fā)現(xiàn)自己被綠了百匆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呜投,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出存璃,到底是詐尸還是另有隱情仑荐,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布纵东,位于F島的核電站粘招,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏偎球。R本人自食惡果不足惜洒扎,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衰絮。 院中可真熱鬧袍冷,春花似錦、人聲如沸猫牡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淌友。三九已至煌恢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間震庭,已是汗流浹背瑰抵。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留器联,地道東北人二汛。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像主籍,于是被迫代替她去往敵國和親习贫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 作為一個合格的開發(fā)者千元,不要只滿足于編寫了可以運行的代碼苫昌。而要了解代碼背后的工作原理;不要只滿足于自己的程序...
    六個周閱讀 8,448評論 1 33
  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中幸海。 1. Hello world 這段代碼將一個一級標題插入到指...
    ryanho84閱讀 6,232評論 0 9
  • 最近看了一本關(guān)于學習方法論的書祟身,強調(diào)了記筆記和堅持的重要性奥务。這幾天也剛好在學習React,所以我打算每天堅持一篇R...
    gaoer1938閱讀 1,680評論 0 5
  • 1袜硫、什么是react React.js 是一個幫助你構(gòu)建頁面 UI 的庫氯葬。React.js 將幫助我們將界面分成了...
    谷子多閱讀 2,557評論 1 13
  • 以下內(nèi)容是我在學習和研究React時,對React的特性婉陷、重點和注意事項的提取帚称、精練和總結(jié),可以做為React特性...
    科研者閱讀 8,232評論 2 21