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;