仿知乎日报学习笔记与优化

仿知乎日报学习笔记与优化
项目原地址(有些小BUG):单页网页应用:https://github.com/pomelo-chuan/Zhihu-Daily-Vue.js
知乎日报api查询:https://github.com/izzyleung/ZhihuDailyPurify/wiki/%E7%9F%A5%E4%B9%8E%E6%97%A5%E6%8A%A5-API-%E5%88%86%E6%9E%90
如果想看完整的API的json数据的话,推荐使用sublime,网上搜索sublime json格式化。
1.vuex跨域访问
1.1定义api:const urlBase = ‘/api/‘;
1.2在config中配置api的HTTP代理表: HTTP代理表,指定规则,将某些API请求代理到相应的服务器
proxyTable: {
‘/api‘: {
target: ‘https://news-at.zhihu.com/api/4‘,
changeOrigin: true,
pathRewrite: {
‘^/api‘: ‘/‘
}
}
}
1.3配置API请求node-file.js:
以该项目首页点击加载更多内容为例
router.get(‘/before/:time‘, function (req, res, next) {
var time = req.params.time;
var options = {
method: "GET",
url: "http://news-at.zhihu.com/api/4/news/before/" + time
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
res.json(JSON.parse(body))
});
});
1.4访问顺序
1.点击链接---被router接收---返回一个组件--组件在created时通过dispatch动作去fetch数据--通过axios进行跨域访问---定义的/api/被代理表转化为https://news-at.zhihu.com/api/4/****--****被router.get捕获--获取api的json数据--完成以后commit到mutation对数组进行处理赋值---.vue通过计算属性获取数值
这里,因为将API请求代理到相应的服务器所以router.get中的 url: "http://news-at.zhihu.com/api/4/news/before/" + time才会有效的,即通过服务器进行跨域访问
优化设置axios的baseURL=‘/api‘,这样就不用每次手工加api了
2.点击链接---被router接收---返回一个组件--组件在mouted时通过回调函数this.axios.get()进行伪跨域访问,在http.js为axios的baseUrl赋值如:
axios.defaults.baseURL = ‘https://api.github.com‘;
再使用拦截器进行一系列参数赋值等等最后返回response,即api的json数据对.vue中的date进行赋值。拦截器拦截所有的请求与响应。这个具体实现步骤可以参照项目:https://github.com/superman66/vue-axios-github。
这里跟跨域很像,但是我觉得不是跨域,是根据header的标识来返回github上我的资源的。这个项目是没有配置proxytable的
2.关于首页点击加载更多内容,点击一次,天数减少一天的实现:
2.1在state中定义当前时间:time: moment()
2.2在action中讲当前时间格式化:var now = state.time.format("YYYYMMDD")
2.3在把要更改的数据放入mutation中,同时对天数进行减一操作:
[types.TOGGLE_NEWS_LATEST_MORE](state, all) {
state.NewsListRoot.push(all)
state.time.subtract(1, "days")
state.LoadingOne = false
}
3.首页数据未获取前加载动画效果,结束动画效果以及数据获取显示的操作
mutations与actions:
mutations是用来处理同步的事情的,比如给state中的变量赋值
actions是用来处理异步的事情,比如网络请求(axios);
但是actions也是可以做同步的事情的,但最好按照vuex的建议来做:在mutations中处理同步操作
3.1create函数中判断首页数据是否加载
if (!!this.DONE_NEWS_LATEST.stories && this.DONE_NEWS_LATEST.stories.length > 0) {} else {
this.$store.dispatch(‘FECTH_NEWS_LATEST‘)
}
3.2如果未加载则执行dispatch到actions,state完成改变时,动画结束
[types.FECTH_NEWS_LATEST]({commit}) {
state.LoadingTwo = true
commit(‘showLoding‘);
axios.get(urlBase + ‘news/latest‘)
.then(res => {
commit(types.TOGGLE_NEWS_LATEST, res.data);
commit(‘hideLoading‘);
}).catch(err => console.log(err))
}
3.3在mutations中写Loading的状态,同时在把要更改的数据放入mutation中(更改 Vuex 的 store 中的状态的唯一方法是提交 mutation):
3.3.1写Loading的状态
showLoding(state) {
state.LoadingTwo = true;
},
hideLoading(state) {
state.LoadingTwo = false;
}
3.3.2把要更改的数据放入mutation中
[types.TOGGLE_NEWS_LATEST](state, all) {
state.NewsListRoot.push(all)
state.NewsLatest = all
// state.LoadingTwo = false
}
3.4把state通过getter返回,同时在APP.vue中通过计算属性的mapGetters辅助函数获取数据
3.4.1返回state
[types.TOGGLE_NEWS_LATEST](state, all) {
state.NewsListRoot.push(all)
state.NewsLatest = all
// state.LoadingTwo = false
}
3.4.2获取getter
computed: {
...mapGetters([‘DONE_NEWS_LATEST‘, ‘DONE_LOADING_ONE‘, ‘DONE_LOADING_TWO‘, ‘DONE_NEWS_LIST_ROOT‘])
}
3.5在vue.app的html里显示数据
4.状态判断决定是否显示组件
4.1判断状态显示
如果首页两个动画都没有加载的话显示首页的更多按钮
<button v-show="!DONE_LOADING_ONE && !DONE_LOADING_TWO" @click="LoadMoreNews()" class="load-more-button pl2 pr2 pt1 pb1 mb2 mt1">更多</button>
4.2监听显示//1.setInterval 2.状态值BackToTopIsShow
1.组件<button @click="backToTop" v-show="BackToTopIsShow" class="back-to-top p1">//返回顶部的按钮
2.页面创建时就创建监听函数:
created: function() {
var _this = this
// 监听页面已滑动的位置,当页面滑动了400px之后,显示“返回顶部”按钮,跟固定在顶部的导航栏
function backToTop(){
setInterval(function(){
if(window.scrollY>400) {
_this.BackToTopIsShow = true
_this.ZhihuHeadFixClass= ‘ZhihuHeadFixClass-on‘
} else {
_this.BackToTopIsShow = false
_this.ZhihuHeadFixClass= ‘ZhihuHeadFixClass-none‘
}
},500)
}
backToTop()
if (!!this.DONE_NEWS_LATEST.stories && this.DONE_NEWS_LATEST.stories.length > 0) {} else {
this.$store.dispatch(‘FECTH_NEWS_LATEST‘)
}
}
5.路由传值传id
5.1设置id值,显示到url
<router-link :to="{name: ‘themes-list‘, params: {id: item.id}}">
5.2到router中查询组件并且返回
5.3组件根据url中的id值去fetch数据,通过router,proxy跨域访问获取json数据
其中const urlBase = ‘/api/‘等效于const urlBase = ‘http://news-at.zhihu.com/api/4‘前面已经在proxy中配置过了。
created: function() {
this.$store.dispatch(‘FETCH_NEWS_DETAIL‘, this.$route.params.id)
}
5.3mutation对数据进行处理
5.4通过getter返回数据
6.原项目的bug修改
6.1首页点击更多无法加载更多消息(已改)
6.2专题页面点击消息无法加载详情页(已改)
6.3图片加载问题,以NewsDetail为例,原项目图片无法加载,我判断是因为http的缓存问题,点击了url的链接,链接显示错误,我判断原作者加 all.body = all.body.replaceAll(‘src=\"‘, ‘src=\"http://lovestreet.leanapp.cn/zhihu/resource?url=‘)
是为了在别的网页缓存这些图片以便用户端直接显示图片,但是
http://lovestreet.leanapp.cn/zhihu/resource?url=“图片链接”现在已经失效了我把它去掉了,如果要显示图片需要先打开一下图片的url如专题第一个日常心理学的url:http://pic3.zhimg.com/0e71e90fd6be47630399d63c58beebfc.jpg
然后刷新页面,那个图片正常显示。但是修复打开页面就直接显示图片我没改好。
7.项目简化
7.1修改了ThemeList中的type判断,根据API分析,type作用未知,但是目前我查到的类型type都是为0,所以对原代码进行了判断的简化,即只存在type为0的情况
7.2ZhihuHeadFix我把它去掉了。
7.3刚刚接触webpack肯定对那些代码很陌生,所以我给build config这两个文件夹里的代码加了很多的注释,关于页面热更新,loader处理器,http代理表等等
详情参照:http://blog.csdn.net/hongchh/article/details/55113751
8.vue-cli架构
参照vue命令行工具
# 全局安装 vue-cli
$ npm install --global vue-cli
# 创建一个基于 webpack 模板的新项目
$ vue init webpack my-project
# 安装依赖,走你
$ cd my-project
$ npm run dev
我是直接通过yeoman上的模板创建项目的,结构都差不多吧,该项目因为需要跨域访问知乎api,所以需要配置一下proxy---http代理表,当然了,我觉得用JQuery的JSONP也是可以的。至此该项目学习完毕。
9.对webpack作了详细的说明,可看文件夹build和config中的注释
刚刚接触webpack肯定对那些代码很陌生,所以我给build config这两个文件夹里的代码加了很多的注释,关于页面热更新,loader处理器,http代理表等等
  详情参照:http://blog.csdn.net/hongchh/article/details/55113751
10.运行方法/install dependencies(个人比较推荐cnpm,速度快)
git clone https://github.com/Archer-Fang/hellowVue
npm install
npm run dev

原文地址:https://www.cnblogs.com/Archer-Fang/p/8995501.html

时间: 2024-10-12 21:31:58

仿知乎日报学习笔记与优化的相关文章

MySQL必知必会 学习笔记(一)

第一章  了解SQL 模式:   关于数据库和表的布局以及特性的信息.[描述表可以存储什么样的数据,数据如何分解,各部分信息如何命名等等,可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)]. 第二章 MySQL简介 MySQL是一种DBMS,即它是一种数据库软件.基于客户机----服务器的数据库. MySQL工具: 1.mysql 命令行实用程序 2.MySQL Administrator 3.MySQL query Browser 第四章 检索数据 LIMIT 5 表示MySQL返

《Java程序性能优化》学习笔记 Ⅰ设计优化

豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞吐量: 响应时间: 2.木桶定律   系统的最终性能取决于系统中性能表现最差的组件,例如window系统内置的评分就是选取最低分.可能成为系统瓶颈的计算资源如,磁盘I/O,异常,数据库,锁竞争,内存等. 性能优化的几个方面,如设计优化,Java程序优化,并行程序开发及优化,JVM调优,Java性能调

微信小程序开发日记——高仿知乎日报(上)

本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教程分为以下三篇 微信小程序开发日记--高仿知乎日报(上) 微信小程序开发日记--高仿知乎日报(中) 微信小程序开发日记--高仿知乎日报(下) 三篇分别讲不同的组件和功能块 这篇要讲 API分析 启动页 轮播图 日报列表 浮动按钮 侧滑菜单 API分析 以下是使用到的具体API,更加详细参数和返回结

《Java程序性能优化》学习笔记 Ⅱ程序优化

这一部分主要介绍代码层的优化.了解如何编写高效而精炼的代码,正确的使用函数方法.1.字符串优化处理Java语言中,String对象可以认为是对char数组的眼神和进一步封装.它主要由3部分组成:char数组.偏移量和String的长度.String对象的三个基本特点:不变性,针对常量池的优化,类的final定义. 不变性:是指String对象一旦生成,不能再对它进行改变,即immutable模式.不变模式的作用在于当一个对象需要被多线程共享,并且访问频繁时,可以省略同步和所等待的时间,大幅提高系

学习笔记-Kuaihu(仿知乎日报)

本文目的:由于第一次学习较为完整的项目,故作记录以系统地整理APP开发知识 先看看整个项目结构: activity, fragment, 不用说了.可以看做MVC中的controller db, 存储json缓存用的,model就是一些bean类比如首页Item的对象,点开详情的文章对象 util嘛一些工具类.里面可以对已有的HTTP工具再次进行封装. view就是一些自定义的或者第三方view类. Kpplication就是自己写的application类,里面进行了第三方工具的初始化,其他没

《MySQL必知必会学习笔记》:正则表达式

正则表达式的应用 前面的几节的过滤例子允许用匹配.比较和通配操作符来寻找数据.对于基本的数据过滤,这样就足够了.但是随着过滤条件的复杂性的增加,where子句本身的复杂性也有必要增加.这也就是正则表达式变得有用的地方. 正则表达式是用来匹配文本中特殊的字符集合. 正则表达式不是自己第一次见,在JAVA/C++ 这些语言中,都有正则表达式,不过他们的用途是一样的,都是匹配文本中的字符串.可能具体的用法不太一样,但也差不多.下面将一一进行学习.介绍. 基本字符的匹配 当我们想查找某列中的字符中是否有

项目实战①—高仿知乎日报(1)逼真的开场动画

在这一篇开头我要感谢我的老师李卫民同志,没有他这个东西做不出来,有了他这个Demo逼近真正的XX日报 〇联网工具类的争论 在联网工具类中,有人说,Xutils 比volly牛逼,又有人说其实volly性能很差,不过我这一篇文章用的就是volly,我感觉不到差距在哪,反而觉得用起来很爽.其实我自己用的就是Xutils不过后面demo写下不下去了,经过李同志的代码重构,得以完全. ① 如何使用Volley 1.什么是Volley 我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTas

正则表达式必知必会--学习笔记

第一章,表达式入门 正则表达式(regular expression)和正则表达式语言已经出现很久了,正则表达式是一种工具,和其他工具一样,它是为了解决一类专门的问题而发明的,就像我们的播种机,是为了播种而发明的.那么主要来解决什么问题呢?我们经常用的到的,从一个文件夹中,快速的找到一个文件,在表单中,验证一个邮箱,我们也会用到正则.我们主要用正则表达式来进行搜索和进行替换,书上的解释是正则表达式是用来匹配和处理文本的字符串.正则表达式是用正则表达是语言创建的,用来解决我们前面所提到的问题,验证

《MySQL必知必会学习笔记》:高级联结

创建高级联结 上篇博文简单的介绍了下联结的使用,这篇博文就介绍下如何来创建高级联结. 使用表别名 在前面的学习中,我们知道如何给列取一个别名,现在回顾下,如下: select cust_name,upper(cust_name) as upper_name from customers; 或者是,用concat函数来对客户的姓名和电话进行组合为一个新的信息 ,将这个新的信息取一个别名,如下: 以上就是给列取别名,也可以给计算字段取别名.不仅如此,SQL还允许给表名取别名.这样做有两个主要理由,如