DataTable数据表

数据表 呈现一个表的行动态创建元素的数组。呈现一个<表>元素有两个列(ID和值)。使用Array.prototype。地图呈现每一项数据作为< tr >元素,包括其索引和价值,给它一个连接的两个关键的生产。

  1. function DataTable({ data }) {
  2. return (
  3. <table><thead><tr>
  4. <th>ID</th>
  5. <th>Value</th>
  6. </tr></thead>
  7. <tbody>
  8. {data.map((val, i) => (
  9. <tr key={`${i}_${val}`}>
  10. <td>{i}</td>
  11. <td>{val}</td>
  12. </tr>
  13. ))}
  14. </tbody></table>
  15. );}

MappedTable   

呈现一个表的行动态创建一个数组对象和属性名称的列表。      
使用种(),Array.prototype.filter (), Array.prototype.includes()和Array.prototype.reduce()来产生一个filteredData数组,包含所有对象propertyNames中指定的键。   
呈现一个<表>元素的一组列等于在propertyNames的数量值。   
使用Array.prototype。地图呈现propertyNames数组中的每个值< th >元素。   
使用Array.prototype。地图呈现filteredData数组中的每个对象作为< tr >元素,包含一个< td >中每一个关键对象

  1. function MappedTable({ data, propertyNames }) {
  2. let filteredData = data.map(v =>
  3. Object.keys(v)
  4. .filter(k => propertyNames.includes(k))
  5. .reduce((acc, key) => ((acc[key] = v[key]), acc), {})
  6. );
  7. return (
  8. <table>
  9. <thead>
  10. <tr>
  11. {propertyNames.map(val => (
  12. <th key={`h_${val}`}>{val}</th>
  13. ))}
  14. </tr>
  15. </thead>
  16. <tbody>
  17. {filteredData.map((val, i) => (
  18. <tr key={`i_${i}`}>
  19. {propertyNames.map(p => (
  20. <td key={`i_${i}_${p}`}>{val[p]}</td>
  21. ))}
  22. </tr>
  23. ))}
  24. </tbody>
  25. </table>
  26. );
  27. }

MultiselectCheckbox

呈现一个复选框列表,使用一个回调函数来将其选择的价值/值传递给父组件。      
使用React.setState()来创建一个数据状态变量并设置其初始值等于选择道具。   
创建一个函数用于切换开关检查更新onChange回调状态函数和调用的数据通过组件的道具。   
呈现一个< ul >元素和使用Array.prototype.map()将数据状态变量映射到单个

  • 元素作为自己的孩子。   
    每个元素类型=“复选框”属性,并标记为只读的,作为它的点击事件是由父
  • 元素的onClick处理程序。

    1. const style = {
    2. listContainer: {
    3. listStyle: 'none',
    4. paddingLeft: 0
    5. },
    6. itemStyle: {
    7. cursor: 'pointer',
    8. padding: 5
    9. }
    10. };
    11. function MultiselectCheckbox({ options, onChange }) {
    12. const [data, setData] = React.useState(options);
    13. const toggle = item => {
    14. data.map((_, key) => {
    15. if (data[key].label === item.label) data[key].checked = !item.checked;
    16. });
    17. setData([...data]);
    18. onChange(data);
    19. };
    20. return (
    21. <ul style={style.listContainer}>
    22. {data.map(item => {
    23. return (
    24. <li key={item.label} style={style.itemStyle} onClick={() => toggle(item)}>
    25. <input readOnly type="checkbox" checked={item.checked || false} />
    26. {item.label}
    27. </li>
    28. );
    29. })}
    30. </ul>
    31. );
    32. }

    TreeView树状视图   

    呈现一个树视图的一个JSON对象或数组可折叠的内容。      
    对于某些道具使用对象destructuring设置默认值。   
    使用切换道具的价值来确定内容的初始状态(折叠/展开)。   
    使用React.setState()钩创建isToggled状态变量,并且给它的值最初提案。   
    返回一个< div >包装的内容组件和< span >元素,用于改变组件的isToggled状态。   
    确定组件的外观,基于isParentToggled isToggled,名称和Array.isArray()的数据。   
    对于每一个孩子在数据,确定它是一个对象或数组和递归子树。   
    否则,呈现一个< p >元素与适当的风格。

    CSS

    1. .tree-element {
    2. margin: 0;
    3. position: relative;
    4. }
    5. div.tree-element:before {
    6. content: '';
    7. position: absolute;
    8. top: 24px;
    9. left: 1px;
    10. height: calc(100% - 48px);
    11. border-left: 1px solid gray;
    12. }
    13. .toggler {
    14. position: absolute;
    15. top: 10px;
    16. left: 0px;
    17. width: 0;
    18. height: 0;
    19. border-top: 4px solid transparent;
    20. border-bottom: 4px solid transparent;
    21. border-left: 5px solid gray;
    22. cursor: pointer;
    23. }
    24. .toggler.closed {
    25. transform: rotate(90deg);
    26. }
    27. .collapsed {
    28. display: none;
    29. }

    JS

    1. function TreeView({
    2. data,
    3. toggled = true,
    4. name = null,
    5. isLast = true,
    6. isChildElement = false,
    7. isParentToggled = true
    8. }) {
    9. const [isToggled, setIsToggled] = React.useState(toggled);
    10. return (
    11. <div
    12. style={{ marginLeft: isChildElement ? 16 : 4 + 'px' }}
    13. className={isParentToggled ? 'tree-element' : 'tree-element collapsed'}
    14. >
    15. <span
    16. className={isToggled ? 'toggler' : 'toggler closed'}
    17. onClick={() => setIsToggled(!isToggled)}
    18. />
    19. {name ? <strong>&nbsp;&nbsp;{name}: </strong> : <span>&nbsp;&nbsp;</span>}
    20. {Array.isArray(data) ? '[' : '{'}
    21. {!isToggled && '...'}
    22. {Object.keys(data).map((v, i, a) =>
    23. typeof data[v] == 'object' ? (
    24. <TreeView
    25. data={data[v]}
    26. isLast={i === a.length - 1}
    27. name={Array.isArray(data) ? null : v}
    28. isChildElement
    29. isParentToggled={isParentToggled && isToggled}
    30. />
    31. ) : (
    32. <p
    33. style={{ marginLeft: 16 + 'px' }}
    34. className={isToggled ? 'tree-element' : 'tree-element collapsed'}
    35. >
    36. {Array.isArray(data) ? '' : <strong>{v}: </strong>}
    37. {data[v]}
    38. {i === a.length - 1 ? '' : ','}
    39. </p>
    40. )
    41. )}
    42. {Array.isArray(data) ? ']' : '}'}
    43. {!isLast ? ',' : ''}
    44. </div>
    45. );
    46. }