React中組件封裝


一、JS打包入口文件 main.js 
    1、代碼
/* JS打包入口文件 */
//1、導入react包
import React from "react";
import ReactDOM from "react-dom";
 
import CommentList from "./components/CommenList.jsx";
import CommentItem from "./components/CommentItem.jsx";
 
import "./css/CommenList.css";
var myDiv = (
  <div>
    <CommentList></CommentList>
  </div>
);
ReactDOM.render(myDiv, document.getElementById("app"));
    2、文件結構
 
二、CommenList.jsx組件
import React from "react";
//導入當前組建需要的子組件
import CommentItem from "./CommentItem.jsx";
export default class CommentList extends React.Component {
  constructor(props) {
    super(props);
 
    //定義一個當前評論列表組件的私有數據
    this.state = {
      cmts: [
        { user: "張大仙", content: "王者峽谷見" },
        { user: "一眼萬年", content: "刺激戰場我最強" },
        { user: "安其拉", content: "收起你的憐憫" },
        { user: "凱帝", content: "希望天下無仇" },
        { user: "李白", content: "一尊清酒,一把寶劍" },
        { user: "牛魔", content: "平天大聖,不服來戰" },
        { user: "程咬金", content: "戰斗,哪怕只剩最后一滴血" },
      ],
    };
  }
  //在【有狀態組件】中,render函數是必須的,表示渲染哪些虛擬DOM元素並展示出來
  render() {
    console.log("this.state:" + JSON.stringify(this.state));
    /*
      注意:
        1、我們可以直接在JSX語法內部,使用數組的map函數,來遍歷數組的每一項,
           並使用map返回操作后的最新的數組
        2、將CommenList里面的每一項抽離成一個組件CommentItem
        3、{...item}寫法是es6的語法,將item逐一展開
    */
    return (
      <div>
        <h1 className="comm-title">評論列表</h1>
        {this.state.cmts.map((item, i) => {
          return (
            /* <CommentItem
              user={item.user}
              content={item.content}
              key={i}
            ></CommentItem> */
            <CommentItem {...item} key={i}></CommentItem>
          );
        })}
      </div>
    );
  }
}
    注意:CommenList組件循環遍歷數據,將每一項的item數據通過組件傳值的方式傳給CommenItem組件
 
三、CommenItem.jsx組件
import React from "react";
import cmtItemStyles from "./cmtItemStyles.js";
 
//封裝一個評論【無狀態組件】
export default function CommentItem(props) {
  //樣式的右方優化方式1:
  const boxStyle = {
    fontSize: 16,
    color: "purple",
  };
  //樣式的優化方式2:
  const inlineStyles = {
    boxStyle2: {
      fontSize: 14,
      color: "red",
    },
  };
  let date = new Date();
  let Y = date.getFullYear();
  let M = date.getMonth() + 1;
  let D = date.getDay();
  return (
    /*
      1、如果要使用style屬性,為JSX語法創建的DOM元素設置樣式,不能像網頁中
      那樣寫,而是要使用js語法來寫
      2、外層{}表示是JS代碼;內層的{}是指用JS對象來表示
      3、在style的樣式規則中,如果屬性值的單位是px,則可以省略px,直接寫一個數值即可
    */
    <div
      style={{
        border: "1px solid #ccc",
        margin: "10px 0",
        paddingLeft: "15px",
        display: "flex",
        justifyContent: "space-between",
      }}
    >
      <h1 style={boxStyle}>評論人:{props.user}</h1>
      <h2 style={inlineStyles.boxStyle2}>評論內容:{props.content}</h2>
      <h2 style={cmtItemStyles.boxStyle3}>
        時間:{Y + "年" + M + "月" + D + "日"}
      </h2>
    </div>
  );
}
注意:CommenItem組件由function創建的,我們通過propes形參來接收CommenList組件傳遞過來的數據,然后渲染每一項。
 
四、運行結果
 
五、分析
      該評論列表整體是一個組件,但是我們在實現的時候,希望代碼具有更好的可讀性、維護性,所以將這個評論組件可以分為兩個組件:
       1、是CommenList組件,這個組件里面主要的功能是獲取/定義評論列表的數據,然后我們需要渲染在主頁里面,渲染的時候必定會循環遍歷這些數據,然后再次循環渲染每一項。
       2、為了更好的實現代碼的健壯性,我們將循環渲染每一項這個動作交給CommenItem組件。
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM