如何封装下拉菜单插件呢?
来源:10-3 课程总结
qq_慕九州2374973
2020-09-21
再次复习了一遍这个课程。请教老师一个问题,如何用React数据驱动的方式封装一个自定义的插件呢?
老师可以讲讲具体思路吗?前面基础课程中有讲解dom获取节点的方式封装了一个下拉菜单。
写回答
2回答
-
qq_慕九州2374973
提问者
2020-09-24
DropDown.js import React, { PureComponent, Fragment } from "react"; import axios from "axios"; import { Globalstyle } from './style'; class DropDown extends PureComponent { constructor(props) { super(props); this.state = ({ list: [], loaded: false, mouseInToggle: false, mouseInLayer: false }); } getDropdownLayer() { const newList = []; this.state.list.map((item) => ( newList.push( <li key={item.id}> <a href={item.url} target="_blank" className="menu-item" rel="noopener noreferrer"> {item.name} </a> </li> ) )) if(this.state.mouseInToggle || this.state.mouseInLayer) { return( <ul className="dropdown-layer dropdown-left" onMouseEnter={() => this.handleMouseEnterLayer()} onMouseLeave={() => this.handleMouseLeaveLayer()} > {newList} </ul> ); }else { return null; } } render() { return( <Fragment> <Globalstyle/> <div className="menu dropdown fl"> <a href="#" className="dropdown-toggle" onMouseEnter={() => this.handleMouseEnterToggle()} onMouseLeave={() => this.handleMouseLeaveToggle()} style={{float: "left"}} > 请点击 </a> {this.getDropdownLayer()} </div> </Fragment> ); } handleMouseEnterToggle = () => { this.setState({ mouseInToggle: true }); axios.get("/api/dropdown.json").then((res) => { const list = res.data.data.list; this.setState({ list }); }) } handleMouseLeaveToggle = () => { this.setState({ mouseInToggle: false }); } handleMouseEnterLayer = () => { this.setState({ mouseInLayer: true }); } handleMouseLeaveLayer = () => { this.setState({ mouseInLayer: false }); } } export default DropDown; style.js: import { createGlobalStyle } from 'styled-components'; export const Globalstyle = createGlobalStyle` html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } body { line-height: 1; } ol, ul { list-style: none; } blockquote, q { quotes: none; } blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } table { border-collapse: collapse; border-spacing: 0; } /*常用公共样式*/ em, i { font-style: normal; } a { text-decoration: none; } li { list-style-type: none; vertical-align: top; } img { border: none; /*display: block;*/ vertical-align: top; } textarea { overflow: auto; resize: none; } .fl { float: left; display: inline; } .fr { float: right; display: inline; } .cf:before, .cf:after { content: " "; display: table; } .cf:after { clear: both; } .cf { *zoom: 1; } .dropdown{ position: relative; } .dropdown-toggle{ position: relative; z-index: 2; } .dropdown-arrow{ display: inline-block; background-repeat: no-repeat; margin-left: 8px; vertical-align: middle; } .dropdown-layer{ overflow: hidden; position: absolute; z-index: 1; } .dropdown-left{ left: 0; right: auto; } .dropdown-right{ right: 0; left: auto; } .dropdown-loading{ width: 32px; height: 32px; background: url("./imgs/loading.gif") no-repeat; margin: 20px; } /*menu dropdown*/ .menu .dropdown-toggle{ display: block; height: 100%; padding: 0 16px 0 12px; border-left: 1px solid #f3f5f7; border-right: 1px solid #f3f5f7; } .menu .dropdown-arrow{ /*width: 8px;*/ /*height: 6px;*/ /*background-image: url("imgs/dropdown-arrow.png");*/ margin-left: 8px; } .menu .dropdown-layer{ top: 100%; background-color: #fff; border: 1px solid #cdd0d4; } .menu-item{ display: block; height: 30px; line-height: 30px; color:#4d555d; white-space: nowrap; padding: 0 12px; } .menu-item:hover{ background-color: #f3f5f7; } .menu-active .dropdown-toggle{ background-color: #fff; border-color:#cdd0d4; } body { background: #eee; } ` 上面这个是我自己用封装的简易效果,大概就是这个效果,但之前用JQuery获取节点的方式它可以有很多中参数,包括动画参数。 下面是JQuery的部分核心代码: $(".dropdown").dropdown({ event:"hover", css3:false, js:false, animation:"slideUpDown", delay:0, active:"menu" }); 就是通过参数的方式就可以设置下拉菜单是通过何种事件触发下拉菜单(hover or click),否有动画,用种动画,下拉菜单的方向,是否有延迟等! React可以实现这些效果吗?00 -
Dell
2020-09-24
能给我看下大概想要实现的效果嘛
022020-09-27
相似问题