React学习(一) 函数式编程 + JSX ——简单列表样式切换

  1.项目目录结构

    1.1 index.js ,React项目入口文件

    1.2 App.js ,根组件

    1.3 views 视图文件,List组件放在 views/list

  

 

  2.index.js 

 1 import React from 'react';
 2 import ReactDOM from 'react-dom';
 3 import './index.css';
 4 import App from './App';
 5 import * as serviceWorker from './serviceWorker';
 6 
 7 ReactDOM.render(
 8   <React.StrictMode>
 9     <App />
10   </React.StrictMode>,
11   document.getElementById('root')
12 );
13 
14 // If you want your app to work offline and load faster, you can change
15 // unregister() to register() below. Note this comes with some pitfalls.
16 // Learn more about service workers: https://bit.ly/CRA-PWA
17 serviceWorker.unregister();

  

  3. App.js 

    3.1 在App.js中模拟了一组数据 data 作为参数;

    3.2 引入List组件将模拟的 data 传给List 组件

import React from 'react';
import List from "./views/list/List";
var data = [
  {
    title: "家人",
    list: [
      { name: "父亲" },
      { name: "母亲" },
      { name: "姐姐" },
    ]
  },
  {
    title: "好友",
    list: [
      { name: "张三" },
      { name: "李四" },
      { name: "王五" },
    ]
  },
  {
    title: "同学",
    list: [
      { name: "123" },
      { name: "321" },
      { name: "132" },
    ]
  },
];
function App() {
  return (
    <div className="App">
        <List data={data} />
    </div>
  );
}

export default App;

  

  4.List.js ,列表组件: 

    4.1 在List主函数中接收props作为组件通信传入的参数,解构出data;对data进行map循环(不用foreach是因为)输出<ListItem /> 组件,将data数组中的每一项传都给独立的一个 ListItem组件

 1 import React from 'react';
 2 import ListItem from './ListItem';
 3 import "./css/list.css";
 4 function List(props) {
 5     console.log(props);
 6     let { data } = props;
 7     return (
 8         <div>
 9             {data.map((el, index) => {
10                
11                 if (el.title) {
12                     return (<ListItem key={index} data={el} />);
13                 }
14             })}
15             <ul className="list-item"></ul>
16         </div>
17     );
18 }
19 
20 export default List;

 

   5. ListItem.js ,列表项组件:接收到的数据结构出title和list数组,使用map方法循环出<li></li>标签对;

    5.1 绑定方法,使用JSX语法对每一个<ul></ul>进行事件绑定,对点击的对象进行class(JSX中为className)的内容修改以达到更改样式的目的;

    5.2 setActive方法允许多个<ul></ul>同时展开,setSingleActive只允许同一时间只展开一个;

 1 import React from "react";
 2 function ListItem(props) {
 3 
 4     let { title, list } = props.data;
 5 
 6     // 可以展开多个
 7     function setActive(e) {
 8         let className = e.target.className;
 9         let reg = (/active/g);
10         if (reg.test(className)) {
11             e.target.className = className.replace(reg, ' ');
12         } else {
13             e.target.className = className + ' active';
14         }
15     }
16     // 只能展开一个
17     function setSingleActive(e) {
18         let className = e.target.className;
19         let reg = (/active/g);
20         if (reg.test(className)) {
21             e.target.className = className.replace(reg, '');
22             return;
23         }
24         let lists = document.querySelectorAll(`.${className}`);
25         lists.forEach(el => {
26             el.className = el.className.replace(reg, '');
27         });
28         e.target.className = className + ' active';
29     }
30 
31     return (
32         <ul className="list" onClick={($event) => { setActive($event) }} >
33             {title}
34             {list.map((el, index) => {
35                 return (
36                     <li className="list-item" key={index}>
37                         {el.name}
38                     </li>
39                 );
40             })}
41         </ul>
42     );
43 }
44 export default ListItem;

 

posted @ 2020-08-11 17:41  粲由  阅读(331)  评论(0编辑  收藏  举报