1. 程式人生 > 其它 >React-Props/列表渲染/條件渲染

React-Props/列表渲染/條件渲染

購物車框架效果圖

# 1. Props 
  1.1  Props/列表渲染/條件渲染 
  什麼是Props?
    當React元素作為自定義元件,將JSX所接受的屬性轉換為單個物件傳遞給元件,這個物件被稱為"Props"
    父元件傳給子元件引數物件(屬性)
    Props是元件固有屬性
    子元件內部不可以對Props進行修改
    更新Props時,需要通過父元件重新傳入新的props,更新子元件.
  React是一個單向資料流
  建立元件 class PropListItem extends Component 
  接受父元件傳遞的Props
  constructor(props) {
    super(props);
    // 如果不寫下面這句會報警告
    this.state = {};
  }
# 函式元件
 ListItemFun.jsx
 1. sfc 快捷方式 無狀態元件
 2. 函式元件是沒有this關鍵字的
 3. 不管是函式元件/還是類元件都會通過babel來轉換成瀏覽器可以執行的程式碼
 4. props 是通過函式的引數傳遞過來的
 5. 沒有生命週期
 優點 輕量 沒有狀態時可以使用
# 類元件
  ListItem.jsx
  建立元件 class PropListItem extends Component 稱為類元件
# 列表渲染
  js表示式來實現列表渲染
  Arr.map(function (item) {
    return _
  }) 
 map方法會生成一個新的陣列, 列表渲染需要為每一項設定key
 
 {
   dataList.map( item => {
    return <PropListItem key={item.id} data={item}/>
    })
 }
# 條件渲染
 vue v-if
 react 
 1. 三目運算子
  <div className={`item-col item-col-count${count < 1 ? '' : '-s' }`}>{count}</div>
 2. 使用函式條件作判斷
  // 通過函式方式來作條件渲染
    renderList () {
      if (dataList.length === 0) {
        return <div className="text-center">購物車是空的</div>
      }
      return dataList.map( item => {
        return <PropListItem key={item.id} data={item}/>
      })
    }
  render() {
    return (
      {
        this.renderList()
      }
    )
  }
 3. 使用與運算子 && 判斷
  {dataList.length === 0 && <div className="text-center">購物車是空的</div> }

  關鍵程式碼如下:

app.js 函式元件

import './App.css';
import PropsList from './Props/List'

function App() {
  return (
    <div className="App">
      <PropsList />
    </div>
  );
}

export default App;

PropsList 元件 類元件

import React, { Component } from 'react'
import PropListItem from './ListItem' // 類元件
// import PropListItem from './ListItemFun'  // 函式元件
const dataList = [
  {
    id: 1,
    name: '筆記本1',
    price: 4500,
    stock: 12
  },
  {
    id: 2,
    name: '筆記本2',
    price: 14500,
    stock: 4
  },
  {
    id: 3,
    name: '筆記本3',
    price: 7800,
    stock: 122
  }
]

class PropsList extends Component {
  // 通過函式方式來作條件渲染
renderList () {
  if (dataList.length === 0) {
    return <div className="text-center">購物車是空的</div>
  }
  return dataList.map( item => {
    return <PropListItem key={item.id} data={item}/>
  })
}
  render() {
    return(
      <div className="container">
        {/* {dataList.length === 0 && <div className="text-center">購物車是空的</div> } */}
        {/* <PropListItem data={dataList[0]}/>
        <PropListItem data={dataList[1]}/>
        <PropListItem data={dataList[2]}/> */
          this.renderList()
        }

      </div>
    )
  }
}
export default PropsList

ListItem 元件 類元件

import React, { Component } from 'react'
import './list.css'
let count = 0
class PropListItem extends Component {

  constructor(props) {
    super(props);
    // 如果不寫下面這句會報警告
    this.state = {};
  }

  render () {
    let data = this.props.data
    return (
      <div className="item-row">
        <div className="item-col">{data.name}</div>
        <div className="item-col">{data.price}</div>
        {/* 三目運算子來作條件判斷 */}
        <div className={`item-col item-col-count${count < 1 ? '' : '-s' }`}>{count}</div>
      </div>
    )
  }
}
export default PropListItem

ListItem 元件 函式元件 只用來測試,只要程式碼還是參考上面的類元件

import React from 'react'
import './list.css'
let count = 0
const ListItem = (props) => {
  return (
    <div className="item-row">
    <div className="item-col">{props.data.name}</div>
    <div className="item-col">{props.data.price}</div>
    <div className="item-col">{count}</div>
  </div>
  )
}
export default ListItem

 list.css

.item-row {
  margin-top: 20px;
  display: flex;
}
.item-col {
  width: 100px;
  height: 30px;
  border: 1px solid #000000;
}
.item-col-count {
  background-color: #ffffff;
}
.item-col-count-s {
  background-color: red;
}

  

將來的自己,會感謝現在不放棄的自己!