Taro小程序自定义顶部导航栏功能的实现


Posted in Javascript onDecember 17, 2020

微信自带的顶部导航栏是无法支持自定义icon和增加元素的,在开发小程序的时候自带的根本满足不了需求,分享一个封装好的组件,支持自定义icon、扩展dom,适配安卓、ios、h5,全面屏。
我用的是京东的Taro多端编译框架写的小程序,原生的也可以适用,用到的微信/taro的api做调整就行,实现效果如下。

Taro小程序自定义顶部导航栏功能的实现
Taro小程序自定义顶部导航栏功能的实现

1、NavBar.js

import Taro from '@tarojs/taro';
import React, { Component } from 'react'
import { View } from '@tarojs/components';
import { isFunction } from '../../utils/index' //判断是否为函数,可以用loadsh的_isFunction,也可以自己封装。
import './NavBar.less';


function getSystemInfo () {
 if (Taro.globalSystemInfo && !Taro.globalSystemInfo.ios) {
  return Taro.globalSystemInfo;
 } else {
  // h5环境下忽略navbar
  if (!isFunction(Taro.getSystemInfoSync)) {
   return null;
  }
  let systemInfo = Taro.getSystemInfoSync() || {
   model: '',
   system: ''
  };
  let ios = !!(systemInfo.system.toLowerCase().search('ios') + 1);
  let rect;
  try {
   rect = Taro.getMenuButtonBoundingClientRect ? Taro.getMenuButtonBoundingClientRect() : null;
   if (rect === null) {
    throw 'getMenuButtonBoundingClientRect error';
   }
   //取值为0的情况 有可能width不为0 top为0的情况
   if (!rect.width || !rect.top || !rect.left || !rect.height) {
    throw 'getMenuButtonBoundingClientRect error';
   }
  } catch (error) {
   let gap; //胶囊按钮上下间距 使导航内容居中
   let width = 96; //胶囊的宽度
   if (systemInfo.platform === 'android') {
    gap = 8;
    width = 96;
   } else if (systemInfo.platform === 'devtools') {
    if (ios) {
     gap = 5.5; //开发工具中ios手机
    } else {
     gap = 7.5; //开发工具中android和其他手机
    }
   } else {
    gap = 4;
    width = 88;
   }
   if (!systemInfo.statusBarHeight) {
    //开启wifi的情况下修复statusBarHeight值获取不到
    systemInfo.statusBarHeight = systemInfo.screenHeight - systemInfo.windowHeight - 20;
   }
   rect = {
    //获取不到胶囊信息就自定义重置一个
    bottom: systemInfo.statusBarHeight + gap + 32,
    height: 32,
    left: systemInfo.windowWidth - width - 10,
    right: systemInfo.windowWidth - 10,
    top: systemInfo.statusBarHeight + gap,
    width: width
   };
   console.log('error', error);
   console.log('rect', rect);
  }

  let navBarHeight = '';
  if (!systemInfo.statusBarHeight) {
   //开启wifi和打电话下
   systemInfo.statusBarHeight = systemInfo.screenHeight - systemInfo.windowHeight - 20;
   navBarHeight = (function () {
    let gap = rect.top - systemInfo.statusBarHeight;
    return 2 * gap + rect.height;
   })();

   systemInfo.statusBarHeight = 0;
   systemInfo.navBarExtendHeight = 0; //下方扩展4像素高度 防止下方边距太小
  } else {
   navBarHeight = (function () {
    let gap = rect.top - systemInfo.statusBarHeight;
    return systemInfo.statusBarHeight + 2 * gap + rect.height;
   })();
   if (ios) {
    systemInfo.navBarExtendHeight = 4; //下方扩展4像素高度 防止下方边距太小
   } else {
    systemInfo.navBarExtendHeight = 0;
   }
  }

  systemInfo.navBarHeight = navBarHeight; //导航栏高度不包括statusBarHeight
  systemInfo.capsulePosition = rect; //右上角胶囊按钮信息bottom: 58 height: 32 left: 317 right: 404 top: 26 width: 87 目前发现在大多机型都是固定值 为防止不一样所以会使用动态值来计算nav元素大小
  systemInfo.ios = ios; //是否ios
  Taro.globalSystemInfo = systemInfo; //将信息保存到全局变量中,后边再用就不用重新异步获取了
  //console.log('systemInfo', systemInfo);
  return systemInfo;
 }
}
let globalSystemInfo = getSystemInfo();
class NavBar extends Component {
 constructor(props) {
  super(props);
  this.state = {
   configStyle: this.setStyle(globalSystemInfo)
  };
 }
 static options = {
  multipleSlots: true,
  addGlobalClass: true
 };

 UNSAFE_componentWillMount () {
  //获取高度
  // let query = Taro.createSelectorQuery().in(this.$scope)
  // query.select('.lxy-nav-bar').boundingClientRect(rect=>{
  //  const navHeight = rect.height
  //  this.props.personalHomeMod.changeState('navHeight',navHeight)
  // 	// console.log('navHeight',toJS(this.props.personalHomeMod.state))
  // }).exec()
 }
 componentDidShow () {
  if (globalSystemInfo.ios) {
   globalSystemInfo = getSystemInfo();
   this.setState({
    configStyle: this.setStyle(globalSystemInfo)
   });
  }
 }
 handleBackClick () {
  if (isFunction(this.props.onBack)) {
   this.props.onBack();
  } else {
   const pages = Taro.getCurrentPages();
   if (pages.length >= 2) {
    Taro.navigateBack({
     delta: this.props.delta
    });
   }
  }
 }
 handleGoHomeClick () {
  if (isFunction(this.props.onHome)) {
   this.props.onHome();
  }
 }
 handleSearchClick () {
  if (isFunction(this.props.onSearch)) {
   this.props.onSearch();
  }
 }
 static defaultProps = {
  extClass: '',
  background: 'rgba(255,255,255,1)', //导航栏背景
  color: '#000000',
  title: '',
  searchText: '点我搜索',
  searchBar: false,
  back: false,
  home: false,
  iconTheme: 'black',
  delta: 1
 };

 setStyle (systemInfo) {
  const { statusBarHeight, navBarHeight, capsulePosition, navBarExtendHeight, ios, windowWidth } = systemInfo;
  const { back, home, title, color } = this.props;
  let rightDistance = windowWidth - capsulePosition.right; //胶囊按钮右侧到屏幕右侧的边距
  let leftWidth = windowWidth - capsulePosition.left; //胶囊按钮左侧到屏幕右侧的边距

  let navigationbarinnerStyle = [
   `color:${color}`,
   //`background:${background}`,
   `height:${navBarHeight + navBarExtendHeight}px`,
   `padding-top:${statusBarHeight}px`,
   `padding-right:${leftWidth}px`,
   `padding-bottom:${navBarExtendHeight}px`
  ].join(';');
  let navBarLeft;
  if ((back && !home) || (!back && home)) {
   navBarLeft = [
    `width:${capsulePosition.width}px`,
    `height:${capsulePosition.height}px`,
    `margin-left:0px`,
    `margin-right:${rightDistance}px`
   ].join(';');
  } else if ((back && home) || title) {
   navBarLeft = [
    `width:${capsulePosition.width}px`,
    `height:${capsulePosition.height}px`,
    `margin-left:${rightDistance}px`
   ].join(';');
  } else {
   navBarLeft = [`width:auto`, `margin-left:0px`].join(';');
  }
  return {
   navigationbarinnerStyle,
   navBarLeft,
   navBarHeight,
   capsulePosition,
   navBarExtendHeight,
   ios,
   rightDistance
  };
 }

 render () {
  const {
   navigationbarinnerStyle,
   navBarLeft,
   navBarHeight,
   capsulePosition,
   navBarExtendHeight,
   ios,
   rightDistance
  } = this.state.configStyle;
  const {
   title,
   background,
   backgroundColorTop,
   back,
   home,
   searchBar,
   searchText,
   iconTheme,
   extClass
  } = this.props;
  let nav_bar__center;
  if (title) {
   nav_bar__center = <text>{title}</text>;
  } else if (searchBar) {
   nav_bar__center = (
    <View
     className='lxy-nav-bar-search'
     style={`height:${capsulePosition.height}px;`}
     onClick={this.handleSearchClick.bind(this)}
    >
     <View className='lxy-nav-bar-search__icon' />
     <View className='lxy-nav-bar-search__input'>{searchText}</View>
    </View>
   );
  } else {
   /* eslint-disable */
   nav_bar__center = this.props.renderCenter;
   /* eslint-enable */
  }
  return (
   <View
    className={`lxy-nav-bar ${ios ? 'ios' : 'android'} ${extClass}`}
    style={`background: ${backgroundColorTop ? backgroundColorTop : background};height:${navBarHeight +
     navBarExtendHeight}px;`}
   >
    <View
     className={`lxy-nav-bar__placeholder ${ios ? 'ios' : 'android'}`}
     style={`padding-top: ${navBarHeight + navBarExtendHeight}px;`}
    />
    <View
     className={`lxy-nav-bar__inner ${ios ? 'ios' : 'android'}`}
     style={`background:${background};${navigationbarinnerStyle};`}
    >
     <View className='lxy-nav-bar__left' style={navBarLeft}>
      {back && !home && (
       <View
        onClick={this.handleBackClick.bind(this)}
        className={`lxy-nav-bar__button lxy-nav-bar__btn_goback ${iconTheme}`}
       />
      )}
      {!back && home && (
       <View
        onClick={this.handleGoHomeClick.bind(this)}
        className={`lxy-nav-bar__button lxy-nav-bar__btn_gohome ${iconTheme}`}
       />
      )}
      {back && home && (
       <View className={`lxy-nav-bar__buttons ${ios ? 'ios' : 'android'}`}>
        <View
         onClick={this.handleBackClick.bind(this)}
         className={`lxy-nav-bar__button lxy-nav-bar__btn_goback ${iconTheme}`}
        />
        <View
         onClick={this.handleGoHomeClick.bind(this)}
         className={`lxy-nav-bar__button lxy-nav-bar__btn_gohome ${iconTheme}}`}
        />
       </View>
      )}
      {!back && !home && this.props.renderLeft}
     </View>
     <View className='lxy-nav-bar__center' style={`padding-left: ${rightDistance}px`}>
      {nav_bar__center}
     </View>
     <View className='lxy-nav-bar__right' style={`margin-right: ${rightDistance}px`}>
      {this.props.renderRight}
     </View>
    </View>
   </View>
  );
 }
}

export default NavBar;

2、NavBar.less

view,
text,
scroll-view,
input,
button,
image,
cover-view {
 box-sizing: border-box;
}
page {
 /* prettier-ignore */
 --height: 44PX; /* 4*2+32 */
 /* prettier-ignore */
 --right: 97PX; /* 10+87 */
 /* prettier-ignore */
 --navBarExtendHeight: 4PX;
 /* prettier-ignore */
 --navBarHeight: 68PX;
 box-sizing: border-box;
}
.lxy-nav-bar .ios {
 /* prettier-ignore */
 --height: 44PX; /* 4*2+32 */
 /* prettier-ignore */
 --right: 97PX; /* 10+87 */
 /* prettier-ignore */
 --navBarExtendHeight: 4PX;
 box-sizing: border-box;
}
.lxy-nav-bar .android {
 /* prettier-ignore */
 --height: 48PX; /* 8*2+32 */
 /* prettier-ignore */
 --right: 96PX; /* 10+87 */
 /* prettier-ignore */
 --navBarExtendHeight: 4PX;
 box-sizing: border-box;
}
.lxy-nav-bar .devtools {
 /* prettier-ignore */
 --height: 42PX; /* 5*2+32 */
 /* prettier-ignore */
 --right: 88PX; /* 10+87 */
 /* prettier-ignore */
 --navBarExtendHeight: 4PX;
 box-sizing: border-box;
}
.lxy-nav-bar__inner {
 position: fixed;
 top: 0;
 left: 0;
 z-index: 5001;
 /* prettier-ignore */
 height: var(--navBarHeight);
 display: flex;
 align-items: center;
 padding-right: var(--right);
 width: 100%;
 /* prettier-ignore */
 padding-top: 20PX;
 /* prettier-ignore */
 padding-bottom:4PX;
 .placeholder {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
 }
}
.lxy-nav-bar__inner .lxy-nav-bar__left {
 position: relative;
 width: var(--right);
 /* prettier-ignore */
 height: 32PX;
 /* padding-left: 10PX; */
 /* prettier-ignore */
 margin-left:10PX;
 display: flex;
 align-items: center;
}
.lxy-nav-bar__buttons {
 height: 100%;
 width: 100%;
 display: flex;
 align-items: center;
 /* prettier-ignore */
 border-radius: 16PX;
 border: 1px solid rgba(204, 204, 204, 0.6);
 position: relative;
}
.lxy-nav-bar__buttons.android {
 border: 1px solid rgba(234, 234, 234, 0.6);
}
.lxy-nav-bar__buttons::after {
 position: absolute;
 content: '';
 width: 1px;
 /* prettier-ignore */
 height: 18.4PX;
 background: rgba(204, 204, 204, 0.6);
 left: 50%;
 top: 50%;
 transform: translate(-50%, -50%);
}
.lxy-nav-bar__buttons.android::after {
 background: rgba(234, 234, 234, 0.6);
}
.lxy-nav-bar__button {
 width: 50%;
 height: 100%;
 display: flex;
 /* prettier-ignore */
 font-size: 12PX;
 background-repeat: no-repeat;
 background-position: center center;
 background-size: 1em 2em;
}

.lxy-nav-bar__inner .lxy-nav-bar__left .lxy-nav-bar__btn_goback:active,
.lxy-nav-bar__inner .lxy-nav-bar__left .lxy-nav-bar__btn_gohome:active {
 opacity: 0.5;
}
.lxy-nav-bar__inner .lxy-nav-bar__center {
 /* prettier-ignore */
 font-size: 17PX;
 /* prettier-ignore */
 line-height: 17PX;
 text-align: center;
 position: relative;
 flex: 1;
 display: -webkit-box;
 display: -webkit-flex;
 display: flex;
 align-items: center;
 justify-content: center;
 /* prettier-ignore */
 padding-left: 10PX;
 text {
  margin-top: -2px;
  font-size:34px;
  font-weight:550;
  line-height:44px;
 }
}
.lxy-nav-bar__inner .lxy-nav-bar__loading {
 font-size: 0;
}
.lxy-nav-bar__inner .lxy-nav-bar__loading .lxy-loading {
 margin-left: 0;
}
.lxy-nav-bar__inner .lxy-nav-bar__right {
 /* prettier-ignore */
 margin-right: 10PX;
}
.lxy-nav-bar__placeholder {
 height: var(--navBarHeight);
 background: #f8f8f8;
 position: relative;
 z-index: 50;
 visibility: hidden;
}

.lxy-nav-bar-search {
 width: 100%;
 height: 100%;
 display: flex;
 justify-content: center;
 align-items: center;
 width: 100%;
 /* prettier-ignore */
 height: 32PX;
 /* prettier-ignore */
 border-radius: 16PX;
 position: relative;
 background: #f6f6f6;
}

.lxy-nav-bar-search__input {
 height: 100%;
 display: flex;
 align-items: center;
 color: #999;
 /* prettier-ignore */
 font-size: 15PX;
 /* prettier-ignore */
 line-height: 15PX;
}
.lxy-nav-bar__inner .lxy-nav-bar__left .lxy-nav-bar__btn_goback {
 background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='24' viewBox='0 0 12 24'%3E %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M10 19.438L8.955 20.5l-7.666-7.79a1.02 1.02 0 0 1 0-1.42L8.955 3.5 10 4.563 2.682 12 10 19.438z'/%3E%3C/svg%3E");
}
.lxy-nav-bar__inner .lxy-nav-bar__left .lxy-nav-bar__btn_goback.white {
 background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='24' viewBox='0 0 12 24'%3E %3Cpath fill-opacity='.9' fill-rule='evenodd' d='M10 19.438L8.955 20.5l-7.666-7.79a1.02 1.02 0 0 1 0-1.42L8.955 3.5 10 4.563 2.682 12 10 19.438z' fill='%23ffffff'/%3E%3C/svg%3E");
}
.lxy-nav-bar__inner .lxy-nav-bar__left .lxy-nav-bar__btn_gohome {
 background-image: url("data:image/svg+xml,%3Csvg t='1565752242401' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='4326' width='48' height='48'%3E%3Cpath d='M537.13744054-106.18008097999996c-12.56871953-12.56871953-31.42179957-12.56871953-50.27488108 0L28.10427953 195.46919964000006c-12.56871953 12.56871953-18.85308003 25.13744054-18.85308003 37.70616005l0 609.58292171c0 25.13744054 18.85308003 43.99052059 43.9905191 43.9905191l301.6492806 0c18.85308004 0 31.42179957-12.56871953 31.42180105-31.42179957l0-314.21800013c0-18.85308004 12.56871953-31.42179957 31.42179956-31.42180105l188.53080038 0c18.85308004 0 31.42179957 12.56871953 31.42179956 31.42180105l0 314.21800013c0 18.85308004 12.56871953 31.42179957 31.42180105 31.42179957L970.7582814 886.7488005c25.13744054 0 43.99052059-18.85308003 43.9905191-43.9905191L1014.7488005 233.17535969000005c0-12.56871953-6.2843605-25.13744054-18.85308003-37.70616005l-458.75827993-301.64928062z' fill='%23000000' p-id='4327'%3E%3C/path%3E%3C/svg%3E");
 /* prettier-ignore */
 background-size: 17PX 34PX;
 margin-top: 10px;
}
.lxy-nav-bar__inner .lxy-nav-bar__left .lxy-nav-bar__btn_gohome.white {
 background-image: url("data:image/svg+xml,%3Csvg t='1565752242401' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='4326' width='48' height='48'%3E%3Cpath d='M537.13744054-106.18008097999996c-12.56871953-12.56871953-31.42179957-12.56871953-50.27488108 0L28.10427953 195.46919964000006c-12.56871953 12.56871953-18.85308003 25.13744054-18.85308003 37.70616005l0 609.58292171c0 25.13744054 18.85308003 43.99052059 43.9905191 43.9905191l301.6492806 0c18.85308004 0 31.42179957-12.56871953 31.42180105-31.42179957l0-314.21800013c0-18.85308004 12.56871953-31.42179957 31.42179956-31.42180105l188.53080038 0c18.85308004 0 31.42179957 12.56871953 31.42179956 31.42180105l0 314.21800013c0 18.85308004 12.56871953 31.42179957 31.42180105 31.42179957L970.7582814 886.7488005c25.13744054 0 43.99052059-18.85308003 43.9905191-43.9905191L1014.7488005 233.17535969000005c0-12.56871953-6.2843605-25.13744054-18.85308003-37.70616005l-458.75827993-301.64928062z' fill='%23ffffff' p-id='4327'%3E%3C/path%3E%3C/svg%3E");
 /* prettier-ignore */
 background-size: 17PX 34PX;
 margin-top: 10px;
}
.lxy-nav-bar-search__icon {
 /* prettier-ignore */
 width: 22PX;
 /* prettier-ignore */
 height: 22PX;
 display: flex;
 align-items: center;
 justify-content: center;
 background-image: url("data:image/svg+xml,%3Csvg t='1565691512239' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='1240' width='48' height='48'%3E%3Cpath d='M819.2 798.254545L674.909091 653.963636c46.545455-48.872727 74.472727-114.036364 74.472727-186.181818 0-151.272727-123.345455-274.618182-274.618182-274.618182-151.272727 0-274.618182 123.345455-274.618181 274.618182 0 151.272727 123.345455 274.618182 274.618181 274.618182 65.163636 0 128-23.272727 174.545455-62.836364l144.290909 144.290909c2.327273 2.327273 6.981818 4.654545 11.636364 4.654546s9.309091-2.327273 11.636363-4.654546c6.981818-6.981818 6.981818-18.618182 2.327273-25.6zM235.054545 467.781818c0-132.654545 107.054545-239.709091 239.709091-239.709091 132.654545 0 239.709091 107.054545 239.709091 239.709091 0 132.654545-107.054545 239.709091-239.709091 239.709091-132.654545 0-239.709091-107.054545-239.709091-239.709091z' fill='%23999999' p-id='1241'%3E%3C/path%3E%3C/svg%3E");
 background-repeat: no-repeat;
 background-size: cover;
}
input{
  padding:0 20px !important;
  text-align: start !important;
}

属性:

Taro小程序自定义顶部导航栏功能的实现

slot:

Taro小程序自定义顶部导航栏功能的实现

到此这篇关于Taro小程序自定义顶部导航栏的文章就介绍到这了,更多相关小程序自定义导航栏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript 24小时弹出一次的代码(利用cookies)
Sep 03 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
Nov 28 Javascript
jQuery实现数字加减效果汇总
Dec 16 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
Nov 02 Javascript
js动态添加的DIV中的onclick事件简单实例
Jul 25 Javascript
各式各样的导航条效果css3结合jquery代码实现
Sep 17 Javascript
JavaScript生成验证码并实现验证功能
Sep 24 Javascript
Vue数组更新及过滤排序功能
Aug 10 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
Feb 08 Javascript
angularJS1 url中携带参数的获取方法
Oct 09 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
Jan 30 Javascript
原生js实现表格循环滚动
Nov 24 Javascript
vue 数据操作相关总结
Dec 17 #Vue.js
Vue 组件注册全解析
Dec 17 #Vue.js
js回到页面指定位置的三种方式
Dec 17 #Javascript
javascript 数组(list)添加/删除的实现
Dec 17 #Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
Dec 16 #Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
Dec 16 #Javascript
原生JS实现拖拽功能
Dec 16 #Javascript
You might like
来自phpguru得Php Cache类源码
2010/04/15 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
php中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
ThinkPHP 404页面的设置方法
2015/01/14 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
JavaScript 事件系统
2010/07/22 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
Python中常见的数制转换有哪些
2020/05/27 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
法国奢华女性时尚配饰网上商店:Monnier Frères
2016/08/27 全球购物
纽约海:Sea New York
2018/11/04 全球购物
中软国际Java程序员机试题
2012/08/19 面试题
《七颗钻石》教学反思
2014/02/28 职场文书
2014年图书室工作总结
2014/12/09 职场文书
业务员辞职信范文
2015/03/02 职场文书
2015小学师德工作总结
2015/07/21 职场文书
浅谈MySQL函数
2021/10/05 MySQL