个人浏览器主页,练手项目。
vue webpack
前言
vue-cli 版本:2.9.6
引用jQuery、popper.js、Bootstrap
参考链接
时钟
首先搞了几张数字的图片:
然后获取当前时间并转换为字符串:
1 2 3 4 5 6 7 8 9 10 11 12 13
| var nDate = new Date(); var str = plusZ(nDate.getHours()) + plusZ(nDate.getMinutes()) + plusZ(nDate.getSeconds()); function plusZ(n) { if (n < 10) { return "0" + n; } else { return "" + n; } }
|
最后设置定时器每秒钟运行一次,这样就可以根据字符串的变化来更新时钟图片的变化了。
天气
还是先搞了几张天气的图标:
由于返回的json文件里标明了当前天气的图标,只需要把它们替换成自己想要的就好了。
下面是一些模板图标,比如温度、风速、湿度等等:
获取api
https://openweathermap.org/api
只需要注册一个帐号,点击邮件中的注册链接后就会在第二封邮件收到一个免费的apikey。
每分钟最多响应60次,足够练习使用。
获取坐标
1 2 3 4 5 6 7 8 9 10 11 12 13
| geolocation() { navigator.geolocation.getCurrentPosition(this.buildUrl,this.geoError); }, buildUrl(position) { const lat = position.coords.latitude; const lon = position.coords.longitude;
this.getWeather(API + "&lat=" + lat + "&lon=" + lon + KEY); }, geoError(error) { this.getWeather(API + "&lat=0&lon=0" + KEY); }
|
发送请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| const API = "https://api.openweathermap.org/data/2.5/weather?units=metric"; const KEY = "&APPID=0ab1cd22e4c10d85a9c380f889155e6b";
getWeather(url) { this.$axios .get(url) .then(res => { console.log(res.data); }) .catch(error => { console.log(error); console.log(url); }); },
|
处理数据
下面的一些方法是第一次尝试的时候使用的,现在用不到了
返回的json文件和处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| { "coord": { "lon": 120.31, "lat": 22.61 }, "weather": [ { "id": 802, "main": "Clouds", "description": "scattered clouds", "icon": "03n" } ], "base": "stations", "main": { "temp": 290.23, "feels_like": 290.44, "temp_min": 288.15, "temp_max": 292.04, "pressure": 1019, "humidity": 82 }, "visibility": 10000, "wind": { "speed": 1.5, "deg": 50 }, "clouds": { "all": 40 }, "dt": 1584298666, "sys": { "type": 1, "id": 7940, "country": "TW", "sunrise": 1584309999, "sunset": 1584353293 }, "timezone": 28800, "id": 1673820, "name": "Kaohsiung City", "cod": 200 }
|
1 2 3 4 5 6 7
| JSON.stringify() JSON.parse(JSON.stringify())
new Date(time * 1000) new Date(1584305795 * 1000).toLocaleString()
.toFixed(n)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| function titleCase(str) { var newStr = str.split(' '); for (var i = 0; i < newStr.length; i++) { newStr[i] = newStr[i].slice(0, 1).toUpperCase() + newStr[i].slice(1).toLowerCase(); } return newStr.join(' '); }
function toCel(n) { return n - 273.15; }
function getWeather() { setTimeout( getWeather, 1000 * 10 ); $.ajax( { } } ); } getWeather();
|
搜索框
简单套用了bootstrap的一个input标签的样式
其中切换谷歌搜索用了个小方法:
1 2 3 4 5 6
| switchGoogle() { window.open( "https://www.google.com/search?q=" + document.getElementById("search").value ); }
|
motto
收集了一些大牛的言论,放在本地json文件,每次页面刷新时用axios随机生成。目前词条数58。
1 2 3 4 5 6 7 8 9 10 11 12
| this.$axios .get("../../static/motto.json") .then(res => { console.log(res.data); m.innerHTML = JSON.stringify(res.data.eng[r]) + "<br />" + JSON.stringify(res.data.zh[r]); }) .catch(err => { console.log(err); });
|
导航栏
一些自己常用的网站链接。直接写在template里了。
新闻
这里借用了dev.to
和hacker news
的api.
两个网站都没有认证需求,所以请求很方便。
dev.to官方文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| var d = document.getElementById("dev"); this.$axios .get("https://dev.to/api/articles") .then(res => { var n = ""; for (var i = 0; i < 10; i++) { n += '<p><a href="' + res.data[i].url + '" style="color:black">' + res.data[i].title + "</a></p>"; } $("#dev").html(n); }) .catch(err => { console.log(err); });
|
hacker news第一次请求返回的是文章id,第二次通过id请求才会返回文章标题和url。
hacker news官方文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| var m = ""; this.$axios .get("https://hacker-news.firebaseio.com/v0/topstories.json") .then(res => { for (var i = 0; i < 10; i++) { this.$axios .get( "https://hacker-news.firebaseio.com/v0/item/" + res.data[i] + ".json" ) .then(res => { m += '<p><a href="' + res.data.url + '" style="color:black">' + res.data.title + "</a></p>"; $("#hacker").html(m); }) .catch(err => { console.log(err); }); } }) .catch(err => { console.log(err); });
|
总结
对vue的生命周期还是不太熟悉,下一步继续学习加以完善。
(typora真的是相当好用,强烈推荐)