写点什么

前端学习总结,经验分享,项目经验分享过程

用户头像
魔王哪吒
关注
发布于: 2021 年 02 月 19 日
前端学习总结,经验分享,项目经验分享过程

哪吒人生信条:如果你所学的东西 处于喜欢 才会有强大的动力支撑。



每天学习编程,让你离梦想更新一步,感谢不负每一份热爱编程的程序员,不论知识点多么奇葩,和我一起,让那一颗四处流荡的心定下来,一直走下去,加油,2021加油!欢迎关注加我vx:xiaoda0423,欢迎点赞、收藏和评论



不要害怕做梦,但是呢,也不要光做梦,要做一个实干家,而不是空谈家,求真力行。

前言


来,和魔王哪吒总结一下,分享一下自己对前端学习总结,经验分享,以及写过的项目经验分享过程


如果觉得还不错的话,浏览的过程中,需要您:


  • 点赞,分享,评论

  • 有钱的捧个钱场,没钱的捧 a 个人场


技术实践、读书笔记、编程技巧、随笔杂谈、原创翻译,漫谈自己人生感触


学习总结


hello,大家好,来给大家分享我的专业学习经验和日常学习经验。对于编码的学习,我认为基础知识和编程实践是最重要的。刚开始学习前端的时候,是将基础知识学习一遍,所用教材可以靠学校发的教材即可。基础学习过后,最重要的就是实践,可以不断做一些模仿网站,以及到最后自己设计网站等。


收藏平时交流的信息:


  • 技术学的再好,没有开发经验,和产品经验,是很难写出好的代码。因为写代码本身是带有目的性的,解决问题。

  • 如果在校,学习程序很迷茫,是因为不知道学这个用来干嘛,自身没有想做的东西,所以就很迷茫,不知道学什么,为什么要学。

  • 工作,要对一个产品了解到什么深度,代码就越健壮。

  • 学习方式是有捷径的避开所有看不懂学习资料,找看的懂的,拿起一本资料或者网上找的资料,细度几分钟,看不懂直接找早别的资料

  • 有可能能力未达到 所有看不懂 也有可能 资料本身描述 很难懂 更有可能 资料描述不适合自己阅读习惯

  • 优先 实现功能 再考虑优化


那么你是否自己坚持了呢?当你想要学习,拿起手机时,你会不会发现,你已经不知不觉偏离了正轨,从娱乐新闻到头版头条,微信 99+未读的消息,你心里想的就是看一会儿,就看一会儿。结果不知不觉时间过去了 10 分钟,半小时,1 小时溜走了。然后你开始焦躁,后悔,自责,但是到了第二天,你又掉进了相同的坑里。


你会不会也很纳闷,为什么我的自制力这么差,为什么有些东西让我欲罢不能,因为你已经上瘾了,有个实验小白鼠遇到电流会躲避,但是奇怪的现象发生了,小白鼠不但没有躲避,反而一次又一次的自我电击,经过发现,原来是实验中不小心把某位置弄错,刚好刺激了快感中枢的位置。所以,你也许就像这小白鼠一样上了瘾。


一个真相是,科技巨头们在社交软件视频平台,网络游戏中精心布置了一个又一个沉迷的钩子,目的就是为了截取更多的用户,获取他们的更多时间和金钱,我们正在被一个算法和娱乐所包裹的电子海洛因中,但很多人却不自知,那么如何摆脱上瘾的行为呢?


就是去了解让人沉迷于网络的钩子:


  • 可望而不可即的诱人目标

  • 无法抵挡无法预知的积极反馈

  • 渐进式的进步和改善的感觉

  • 越来越困难的任务需要解决,但暂未解决的紧张感


如,你发布了某消息,你会去暗中观察,有没有人给我点赞,写文章,有没有人给我点赞,有没有人给我评论等等。(我很期待!!!)


其实你可以把这些钩子投入学习中,把学习当做兴趣,升级打怪,不断提升自己。


你的选择


自己的人生自己选择,你可以选择一条简单的路,选择沉迷在你的手机里,刷视频,打游戏,煲剧,毫不费力的收获大把大把的快乐,你也可以选择一条更加艰难的路,选择自律,选择延迟慢走,选择成长。


用你的右手做什么,由你自己决定


项目经验


下面研究封装工具代码块:


权限控制等信息 auth.js


用来存储 localStorage 本地缓存的方法


// 操作用户token
export function setToken(value) { uni.setStorageSync('token', value); console.log('存储用户信息成功');}export function getToken() { let token = uni.getStorageSync('token'); return token;}export function removeToken() { uni.removeStorageSync('token');}
复制代码


操作用户信息代码如下:


export function setUserInfo(value) { try {  let newValue = JSON.stringify(value);  uni.setStorageSync('userInfo', newValue);  console.log('存储用户信息成功'); } catch (e) {  return; }}
export function getUserInfo() { let userInfo = uni.getStorageSync('userInfo'); console.log('userInfo获取用户信息成功', userInfo); if(userInfo) { return JSON.parse(userInfo); }}
复制代码


项目主题颜色封装:


export function setConfig(value) { try {  let configColor = JSON.stringify(value);  uni.setStorageSync('configColor', configColor);  console.log('存储主题颜色成功'); }catch(e){  return; }}
export function getConfig() { let configColor = uni.getStorageSync('configColor'); if(configColor){ return JSON.parse(configColor); }}
复制代码


获取推荐人 id


export function setRecommend(value) { uni.setStorageSync('recommend', value); console.log('recommend', value);}
export function getRecommend() { let recommend = uni.getStorageSync('recommend'); return recommend;}
复制代码


如果你需要用来存储项目内使用的第三方 api key,可以创建 keys.js 文件:


let txMapKey = 'xxxx' // 腾讯地图的key
export { txMapKey}
复制代码


封装必不可少的支付功能:


创建文件 pay.js,代码如下:


微信公众号支付


// description:微信公众号支付// data 微信支付请求成功之后返回的支付参数// payParams {object} 微信支付需要的参数
function onBridgeReady(data, payParams) { window.WeixinJSBridge.invoke('getBrandWCPayRequest', { appId: data.appId, timeStamp: data.timeStamp, nonceStr: data.nonceStr, package: data.package, signType: data.signType, paySign: data.paySign // 微信签名}, function(res) { // console.log(res); if(res.err_msg === 'get_brand_wcpay_request:ok') { // 支付成功页面 if(payParams.type === 'SHYY') { toastMsg('correct','支付成功'); setTimeout(()=>{ router.push('/home'); },500); }else{ router.push({ path: '/success', query: { orderId: payParams.orderId, totalFree: payParams.totalFree } }); } }else if(res.err_msg === 'get_brand_wcpay_request:fail') { // 支付失败 return alert(res.err_desc); }else{ // 跳转订单详情 toastMsg('warn', '支付取消'); }});}
复制代码


支付宝支付


/** * 支付宝支付 */function alipay(res) {	console.log('调起支付alipay',res);	uni.requestPayment({		provider: 'alipay',		orderInfo: {			"dealId": res.dealId,			"appKey": res.appKey,			"totalAmount": res.totalAmount,			"tpOrderId": res.tpOrderId,			"dealTitle": res.dealTitle,			"rsaSign": res.rsaSign,			"bizInfo": res.bizInfo		},         //订单数据		success: function(res) {			console.log('success:' + JSON.stringify(res));		},		fail: function(err) {			console.log('fail:' + JSON.stringify(err));		}	});}
复制代码


微信小程序支付


function wxpay(ret, orderid) {  console.log('调起支付wxpay', ret);  let res = ret;  let status = false;  uni.requestPayment({    timeStamp: res.timeStamp,    nonceStr: res.nonceStr,    package: res.package,    signType: res.signType,    paySign: res.paySign,    appId: res.appId,    success: function (res) {      console.log('success:' + JSON.stringify(res), res);      uni.showToast({        title: '支付成功!'      });    },    fail: function (err) {      console.log('fail:' + JSON.stringify(err));    }  });}
复制代码


封装的异步请求处理函数代码封装,创建文件 request.js


request('接口名称', {key:value}, '请求方式(默认为GET)').then(res=>{console.log(res)})
复制代码


import { getToken, removeToken } from './auth';let baseUrl = '';async function request(method,params,type,callBack){ // 创建一个名为request请求的方法函数 if (!type) {    type = 'GET'; }  let header = {    //设置请求头信息    'Authorization': getToken(),    'X-Requested-With': 'XMLHttpRequest',    "Accept": "application/json",    "Content-Type": "application/json; charset=UTF-8"  };  let http = {    url: baseUrl + mehtod,    data: params,    method: type,    header: header  }; let promise = new Promise((resolve, reject) => {    uni.request(http).then(res => {      let newdata = res[1].data; // if (newdata.code == 403) {      if (newdata == -1) {        uni.showToast({          title: res[1].data.msg,          icon: 'none'        });      }      resolve(res[1].data);    }).catch(err => {      reject(err);      console.log(err);    });  });  return promise;}export default {  request};
复制代码


创建 util.js 文件:(时间工具)


const formatTime = date => {  const year = date.getFullYear();  const month = date.getMonth() + 1;  const day = date.getDate();  const hour = date.getHours();  const minute = date.getMinutes();  const second = date.getSeconds();  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':');};
const formatNumber = n => { n = n.toString(); return n[1] ? n : '0' + n;};
module.exports = { formatTime: formatTime};
复制代码


store-index.js


创建 store-index.js


import Vue from 'vue'import Vuex from 'vuex'
Vue.use(Vuex)const store = new Vuex.Store({ state: { hasLogin: false, userInfo: {}, }, mutations: { login(state, provider) {
state.hasLogin = true; state.userInfo = provider; uni.setStorage({//缓存用户登陆状态 key: 'userInfo', data: provider }) console.log(state.userInfo); }, logout(state) { state.hasLogin = false; state.userInfo = {}; uni.removeStorage({ key: 'userInfo' }) } }, actions: { }})
export default store
复制代码


App.vue


vuex 管理登陆状态


<script>	/**	 * vuex管理登陆状态	 */	import {		mapMutations	} from 'vuex';	export default {		methods: {			...mapMutations(['login'])		},		onLaunch: function() {			let userInfo = uni.getStorageSync('userInfo') || '';			if(userInfo.id){				//更新登陆状态				uni.getStorage({					key: 'userInfo',					success: (res) => {						this.login(res.data);					}				});			}					},		onShow: function() {			console.log('App Show')		},		onHide: function() {			console.log('App Hide')		},	}</script>
复制代码


main.js


import Vue from 'vue'import store from './store'import App from './App'
const msg = (title, duration=1500, mask=false, icon='none')=>{ //统一提示方便全局修改 if(Boolean(title) === false){ return; } uni.showToast({ title, duration, mask, icon });}
const json = type=>{ //模拟异步请求数据 return new Promise(resolve=>{ setTimeout(()=>{ resolve(Json[type]); }, 500) })}
复制代码


app.vue


vuex 管理登录状态


<script>	// vuex 管理登录状态	import {		mapMutations	} from 'vuex';	export default {		methods: {			...mapMutations(['login'])		},		onLaunch: function() {			let userInfo = uni.getStorageSync('userInfo') || '';			if (userInfo.id) {				// 更新登录状态				uni.getStorage({					key: 'userInfo',					success: (res) => {						this.login(res.data)					}				})			}		},		onShow: function() {			console.log('App Show')		},		onHide: function() {			console.log('App Hide')		}	}</script>
复制代码


main.js


import Vue from 'vue'import App from './App'
//引入vueximport store from './store'import * as filters from './filters' // global filtersconst msg = (title, duration=1500, mask=false, icon='none')=>{ //统一提示方便全局修改 if(Boolean(title) === false){ return; } uni.showToast({ title, duration, mask, icon });}
//把vuex定义成为全局组件Vue.prototype.$store = storeVue.prototype.$api = {msg};
Vue.config.productionTip = false
Object.keys(filters).forEach(key => { Vue.filter(key, filters[key])})
App.mpType = 'app'
const app = new Vue({ ...App, // 挂载 store})app.$mount()
复制代码


点餐系统


效果动画:



main.js


import Vue from 'vue'import App from './App'import router from './router'
Vue.config.productionTip = false;import store from './assets/js/store';
new Vue({ el: '#app', router, store, components: {App}, template: '<App/>'})
复制代码


App.vue


<template>  <div id="app">  	<!--首页的goods数据要缓存-->    <keep-alive>    	<router-view v-if="$route.meta.keepAlive"/>    </keep-alive>    <router-view v-if="!$route.meta.keepAlive"/>  </div></template><script>	//引入样式表	import "./assets/css/ico.css";	import "./assets/css/style.css";	import "./assets/css/animate.min.css";			export default {	  name: 'App'	}</script>
复制代码


router/index.js


import Vue from 'vue'import Router from 'vue-router';import home from '@/components/home';import detail from '@/components/detail';import list from '@/components/list';import pay from '@/components/pay';
Vue.use(Router)
export default new Router({ routes: [ { path: '/', redirect:"/home" }, { path: '/home', name: 'home', meta:{keepAlive:true}, //缓存首页数据 component: home }, { path: '/detail', name: 'detail', component: detail }, { path: '/list', name: 'list', component: list }, { path: '/pay', name: 'pay', component: pay } ]})
复制代码


components 目录


components/detail.vue


<template>	<div class="detail">        <header>            <h1>详情</h1>            <a class="goback-btn icon-chevron-left" href="javascript:;" @click="goback">            </a>        </header>        <div class="cont">            <h4>{{$route.params.item.name}}             	<span class="price">¥{{$route.params.item.price}}</span>            </h4>            <button class="plus-btn icon-shopping-cart" :class="$route.params.item.checked?'ac':''" :disabled="$route.params.item.checked" @click="order"></button>                        <div class="swiper-container">                <div class="swiper-wrapper">                    <div class="swiper-slide" v-for="src in $route.params.item.slide"><img class="slide-img" :src="src"></div>                </div>                <div class="swiper-pagination"></div>            </div>            <div>            </div>            <div class="describe">                {{$route.params.item.describe}}            </div>        </div>    </div></template>
<script> import swiper from "swiper"; import "swiper/dist/css/swiper.min.css";
export default { created() { this.shopping_cart = this.$store.state.shopping_cart; }, data:()=>({ shopping_cart:[]//购物车 }), mounted() { //加载轮播图 var mySwiper = new swiper('.swiper-container', { autoplay: { delay: 2500, disableOnInteraction: false, }, pagination: { el: '.swiper-pagination', }, }) }, methods:{ //返回前页 goback(){ this.$router.go(-1); }, //点餐 order(){ var item=this.$route.params.item; this.shopping_cart.push({ id:item.id, name:item.name, price:item.price, num: 1 }); //item与goods[key]是同一个对象 item.checked=true; //shopping_cart是个数组(引用数据类型),所以,可以不用commit,官方要求用commit //放入store里 this.$store.commit("update_shopping_cart",{ shopping_cart:this.shopping_cart, }); } } }</script>
<style></style>
复制代码


components/home.vue


<template>	<div class="home">		<!--头部-->		<header>			<label><input type="search" v-model="keyword" :placeholder="search_ico"></label>			<button type="button" class="search-btn" @click="search">搜索</button>		</header>
<!--侧边固定栏--> <aside class="animated bounceInLeft"> <ul> <li v-for="(menu,index) in goods_cls" :class="{'ac':cur_goods_cls==menu.id}" @click="changeMenu(index)">{{menu.name}}</li> </ul> </aside>
<!--主菜谱 外层容器用于消除animate动画的bug--> <div style="width:100%; overflow: hidden;">
<div class="order-bar animated bounceInRight"> <div class="order-class" v-for="item in goods_cls"> <h3>{{item.name}}</h3> <ul class="good-list"> <li v-for="id in item.goods"> <router-link :to="{name:'detail',params:{item:goods[id]}}"><img :src="goods[id].img"></router-link> <h4>{{goods[id].name}}</h4> <p class="ellipsis">{{goods[id].describe}}</p> <strong>¥{{goods[id].price}}</strong> <button type="button" @click="order(goods[id],$event)" :class="['pointer-btn',goods[id].checked? 'ac':'']" :disabled="goods[id].checked"><b>点餐</b><i>已点</i></button> </li> </ul> </div> </div> </div> <!--底部--> <footer> <!--购物车--> <div class="shoping-cart animated" :class="{'bounceInUp':showShoppingCart,'shoping-list-slide':showShoppingCart}"> <div class="empty"> <span class="icon-trash" @click="clearShopping"></span> </div> <ul v-if="shopping_cart.length>0"> <li v-for="(itm,index) in shopping_cart">{{itm.name}} <em>¥{{itm.price}}</em> <div> <button class="shoping-sub icon-minus" type="button" @click="s_sub(itm,index)"></button> <span>{{itm.num}}</span> <button class="shoping-add icon-plus" type="button" @click="s_add(itm)"></button> </div> </li> </ul> <ul v-else> <li style="text-align: center">还没有点菜哟!!</li> </ul>
<!--id给抛物线用--> <button type="button" id="shoppingBtn" class="shopping-btn icon-shopping-cart" @click="showShoppingCart=!showShoppingCart"></button> <span class="count" :class="{'hide':totalNum==0}">{{totalNum}}</span> </div>
<!--底部菜单--> <div class="cont"> <div class="order-pointer-footer"> <div class="total"><em>¥{{totalPrice}}</em></div> <a v-if="totalNum>0" href="javascript:;" class="pay-btn" @click="pay">去下单</a> </div> </div> </footer> <!--模态层--> <div class="modal" :class="{'hide':!showShoppingCart}" @click="showShoppingCart=!showShoppingCart"></div> </div></template>
<script> import axios from "axios"; //zepto不支持commonJS,只能用jquery import $ from "jquery"; //自定义抛物线 模块 import par from "../assets/js/parabola.js";
export default { name: 'home', data: () => ({ //菜品 "goods": null, //分类 goods_cls: null, //购物车 shopping_cart: [ /*{ "id":1, "name":"宫保鸡丁", "price":22, "num":1 },*/ ], cur_goods_cls: 1, //当前分类id //总价格 totalPrice: 0, //总数量 totalNum: 0, //显示购物车 showShoppingCart: false, //搜索关键字 keyword: "", //vue只能用属性绑定方式定义placeholder图标 search_ico: "\ue903 请输入菜品名称" }),
created() { //本模块被keepalive,created钩子只运行一次 axios.get("/static/data.json").then( msg => { this.goods = msg.data.goods this.goods_cls = msg.data.goods_cls; //存入store this.$store.commit("update_goods", this.goods); }, () => { alert("连接失败"); } ); //全局路由钩子 this.$router.beforeEach((to, from, next) => { //回调函数 //从搜索页回来,清除关键字 this.keyword = "", //如果打开购物车,直接路由到下单页,再从下单页返回,不显示购物车 this.showShoppingCart = false; next() //一定要记着执行,不然路由不能跳转了 }) }, watch: { //监听购物车变化 shopping_cart: { handler(curval, oldval) { //清空所有数据 this.totalNum = this.totalPrice = 0;
//清空所有菜品checked for(var key in this.goods) { this.goods[key].checked = false; } curval.forEach(item => { //重新计算总额 总数 this.totalNum += item.num; this.totalPrice += item.num * item.price; //禁用已选菜品按钮 this.goods[item.id].checked = true; }); //向vuex的store存储数据 this.$store.commit("update_shopping_cart", this.shopping_cart); }, deep: true //对象内部的属性监听,也叫深度监听 }, }, mounted() { //监听window滚动 window.addEventListener('scroll', this.winScroll) }, methods: { //滚动 winScroll() { var _this = this; var scrollTop = $(window).scrollTop(); var oItem = $('.order-class'); oItem.each(function(i, elm) { //此处不能使用箭头函数,因为$(this) //offset if($(this).offset().top < scrollTop + 200) { _this.cur_goods_cls = i + 1; } }) }, //搜索 search() { if(this.keyword == "") { alert("请输入搜索关键字!!"); } else { //搜索页面的菜品,也可以进入详情页,所以,所有数据都要放在store内 this.$store.commit("update_keyword", this.keyword); this.$router.push("list") } }, //点餐 order(item, ev) { this.shopping_cart.push({ id: item.id, name: item.name, price: item.price, num: 1 });
//加入购物车抛物线 var el = $('<div class="parabola-el"></div>'); $(document.body).append(el); new par.parabola({ origin: ev.target, target: '#shoppingBtn', element: el, time: 500, a: 0.01, callback(el) { el.remove(); } }).move() },
//左侧切换 changeMenu(i) { var aUl = $('.order-class'); //使用position判断的ul $(window).scrollTop(aUl.eq(i).position().top); },
//清空购物车 clearShopping() { this.showShoppingCart = !this.showShoppingCart; this.shopping_cart = []; },
//购物车add s_add(item) { item.num++; },
//购物车sub s_sub(item, i) { item.num--; if(item.num == 0) { this.shopping_cart.splice(i, 1); }; }, //去下单 pay() { this.$router.push({ name: "pay", params: { totalPrice: this.totalPrice } }) }, }, }</script><style scoped>
</style>
复制代码


components/list.vue



<template>    <div class="list">        <header>            <h1>搜索结果</h1>            <router-link to="/home" class="goback-btn icon-chevron-left">            </router-link>            <span class="total">共{{search_list.length}}条</span>        </header>                <ul id="scrollMenu" class="good-list">            <li v-for="item in search_list">                <img :src="item.img" @click="show_detail(item)">                <h4>{{item.name}}</h4>                <p>{{item.describe}}</p>                <strong>¥{{item.price}}</strong>                <button type="button" @click="point(item)" :class="['pointer-btn',item.checked? 'ac':'']" :disabled="item.checked"><b>点餐</b><i>已点</i></button>            </li>        </ul>       <div style="text-align: center;" v-if="search_list.length==0"> 没有搜索结果!</div>    </div></template>
<script> export default { created() { //搜索页面的菜品,也可以进入详情页,所以,所有数据都要放在store内 let keyword=this.$store.state.keyword; let goods=this.$store.state.goods; this.shopping_cart = this.$store.state.shopping_cart; for(var key in goods){ //ES6 字符串新增方法 includes:判断是否存在某个字符 //注意 : //console.log(str.includes('')); //空字符串 返回:true //console.log(str.indexOf('')); //空字符串 返回:0 if(goods[key].name.includes(keyword) && keyword!=""){ this.search_list.push(goods[key]); } } }, data:()=>({ search_list:[], shopping_cart:[] }), methods:{ //点餐 point(item){ this.shopping_cart.push({ id: item.id, name: item.name, price: item.price, num: 1 }); item.checked=true; //放入store里 this.$store.commit("update_shopping_cart",this.shopping_cart); }, //显示详情页 show_detail(item){ this.$router.push({name:"detail",params:{item}}); } }, }</script>
<style scoped> </style>
复制代码


components/pay.vue


<template>    <div class="pay bounceInDown animated">        <h2>订单提交成功</h2>        <p>订单总额:<em style="color: red; font-size:.3rem;">{{$route.params.totalPrice}}</em> 元</p>        <br>        <h3>您的订单编号是:</h3>        <p class="order-num">123456789</p>        <p><button class="pay-btn">去付款</button></p>        <p><button class="goback-btn" @click="goback">返回菜单</button></p>    </div></template>
<script> export default{ methods: { goback() { this.$router.push("home"); } } }</script>
<style></style>
复制代码


js/store.js


import Vue from "vue";import Vuex from "vuex";
//应用插件Vue.use(Vuex);
//定义vuex状态export default new Vuex.Store({ state:{ shopping_cart:[], //购物车 goods:{}, keyword:"", }, mutations:{ update_shopping_cart(state,paylod){// console.log(paylod); this.state.shopping_cart=paylod; }, update_goods(state,paylod){ state.goods=paylod; }, update_keyword(state,paylod){ state.keyword=paylod; } }})
复制代码


js/parabola.js


// JavaScript Documentvar parabola = function(config){    var b = 0,        INTERVAL = 15,        timer = null,        x1,y1,x2,y2,originx,originy,diffx,diffy,speedx;
this.config = config || {}; // 起点 this.origin = $(this.config.origin)||null; // 终点 this.target = $(this.config.target)||null; // 运动的元素 this.element = $(this.config.element)||null; // 曲线弧度 this.a = this.config.a || 0.001; // 运动时间(ms) this.time = this.config.time || 1000;
this.init = function(){ x1 = this.origin.offset().left; y1 = this.origin.offset().top; x2 = this.target.offset().left; y2 = this.target.offset().top; originx = x1; originy = y1; diffx = x2-x1; diffy = y2-y1; speedx = diffx/this.time; b = (diffy - this.a*diffx*diffx)/diffx; this.element.css({ left: x1, top: y1 }) return this; }
// 确定动画方式 this.moveStyle = function(){ var moveStyle = 'position', testDiv = document.createElement('div'); if('placeholder' in testDiv){ ['','ms','moz','webkit'].forEach(function(pre){ var transform = pre + (pre ? 'T' : 't') + 'ransform'; if(transform in testDiv.style){ moveStyle = transform; } }) } return moveStyle; }
this.move = function(){ var start = new Date().getTime(), moveStyle = this.moveStyle(), _this = this; timer = setInterval(function(){ if(new Date().getTime() - start > _this.time){ clearInterval(timer); _this.element.css({ left: x2, top: y2 }) typeof _this.config.callback === 'function' && _this.config.callback(_this.element); return; } var x = speedx * (new Date().getTime() - start); var y = _this.a*x*x + b*x; if(moveStyle === 'position'){ _this.element.css({ left: x+originx, top: y+originy }) }else{ if(window.requestAnimationFrame){ window.requestAnimationFrame(_this.element[0].style[moveStyle] = 'translate('+x+'px,'+y+'px)'); }else{ _this.element[0].style[moveStyle] = 'translate('+x+'px,'+y+'px)'; } } },INTERVAL) return this; } this.init();}
//引入依赖jqueryimport $ from "jquery";
//输出apiexport default{ parabola}
复制代码


小程序


时间 util.js


const formatTime = date => {  const year = date.getFullYear()  const month = date.getMonth() + 1  const day = date.getDate()  const hour = date.getHours()  const minute = date.getMinutes()  const second = date.getSeconds()
return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')}
const formatNumber = n => { n = n.toString() return n[1] ? n : '0' + n}
module.exports = { formatTime: formatTime}
复制代码


权限管理 auth.js


// 获取指定权限
function getAuth(param) { wx.getSetting({ success(res) { if (res.authSetting[param.auth] == undefined || res.authSetting[param.auth] == true) { param.success(); } else { // 没有权限就提示去打开 wx.showModal({ title: '提示', content: '需要手动打开' + param.text + '的权限', confirmText: '去打开', cancelText: '放弃', success(res) { if (res.confirm) { wx.openSetting({ success(res) { if (res.authSetting[param.auth] == true) { param.success(); } else { param.fail(); } } }) } else if (res.cancel) { param.fail(); } } }) } }, fail() { param.fail(); }, })}module.exports = getAuth;
复制代码


推荐篇


阅读更多我自己写的文章内容:


  1. 前端面试必备ES6全方位总结

  2. 考前复习必备MySQL数据库(关系型数据库管理系统)

  3. 长篇总结之JavaScript,巩固前端基础

  4. 学习总结之HTML5剑指前端(建议收藏,图文并茂)

  5. 前端必学必会-多媒体-本地存储-浏览器与服务器的交互-通信功能

  6. 【建议👍】记录一次BAT一线互联网公司前端JavaScript面试

  7. Web页面制作基础

  8. 【思维导图】前端开发-巩固你的JavaScript知识体系

  9. 【图文并茂,点赞收藏哦!】重学巩固你的Vuejs知识体系

  10. 【高能笔记】如何获得令人心动的前端offer | 掘金技术征文

  11. 11期前端冲刺必备指南-执行上下文/作用域链/闭包/一等公民

  12. 12期前端冲刺必备指南-HTTP/HTTPS/HTTP2/DNS/TCP/经典题

  13. 13期前端冲刺必备指南-this/call/apply/bind(万字长文)

  14. 14期-连肝7个晚上,总结了计算机网络的知识点!(共66条)

  15. 熬夜总结了 “HTML5画布” 的知识点(共10条)

  16. 16期-熬夜7天,我总结了JavaScript与ES的25个重要知识点!

  17. 17期-什么是MySQL数据库?看这一篇干货文章就够了!

  18. 18期-后端逆袭,一份不可多得的PHP学习指南

  19. 19期-当你在百度搜索关键字的时候,哪个网站会排在最前面?今天给大家科普一下“网站SEO”

❤️关注+点赞+收藏+评论+转发❤️,原创不易,鼓励笔者创作更好的文章



点赞、收藏和评论



我是Jeskson(达达前端),感谢各位人才的:点赞、收藏和评论,我们下期见!(如本文内容有地方讲解有误,欢迎指出☞谢谢,一起学习了)

我们下期见!



文章持续更新,可以微信搜一搜「 程序员哆啦 A 梦 」第一时间阅读,回复【资料】有我准备的一线大厂资料,本文 http://www.dadaqianduan.cn/#/ 已经收录



github收录,欢迎Starhttps://github.com/webVueBlog/WebFamily


发布于: 2021 年 02 月 19 日阅读数: 215
用户头像

魔王哪吒

关注

微信搜:程序员哆啦A梦 2018.05.08 加入

面向JavaScript爱好人员提供:Web前端最新资讯、原创内容、JavaScript、HTML5、Ajax、jQuery、Node.js、Vue.js、React、Angular等一系列教程和经验分享。 博客首发:http://www.dadaqianduan.cn/#/

评论

发布
暂无评论
前端学习总结,经验分享,项目经验分享过程