vue下一页(vue视频网站)
其实vue下一页的问题并不复杂,但是又很多的朋友都不太了解vue视频网站,因此呢,今天小编就来为大家分享vue下一页的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
vue-pdf只显示一页问题解决
在项目开发中,我遇到了一个使用vue-pdf显示PDF文件的问题,即只能加载显示第一页,以下是我的解决方法。
具体使用vue-pdf的方式如下:
在组件中进行使用时,发现多页PDF文件仅显示第一页。
通过查看vue-pdf的源码,我发现其实现原理是将PDF文件按页绘制到canvas上,其中page参数默认值为1,因此只展示了第一页的canvas内容。针对这个问题,我们可以采取以下两种方法解决:
第一种方法是使用v-for循环加载所有页面。
然而,如果PDF文件页数较多,这种方法会导致加载速度较慢。
第二种方法是采用分页的形式进行加载。
这种方式可以保证加载流畅,提升用户体验。
vue原理相关总结
一、vue2.0的双向绑定是怎么实现的
2、observer,compile,watcher
(1)observe是一个数据监听器,核心方法是Object.defineProperty
(3)compile是一个指令解析器,对需要监听的节点和属性进行扫描和解析。
3、此模式的优点:不需要显式调用,可以直接通知变化,更新视图;劫持了属性setter,不需要额外的diff操作
4、Object.defineProperty缺点
(1)不能监听数组
(2)不能监听整个对象,只能监听属性
(3)不能监听属性的增删,只能监听变化
5、3.0版本使用Proxy
(1)可以监听数组
(2)可直接监听整个对象,不用层层递归属性
(3)get和set时候直接有参数,不需要单独存储变量
(4)new Proxy()会返回一个新对象,不会污染源对象。
二、数据不更新的问题
1、更新的原理:在数据读取时收集依赖,在赋值时通知依赖更新。
2、object有defineProperty方法,通过getter,setter只监听了属性的读取和赋值,但是新增属性和删除属性没有检测,所以专门提供了$set和$delete来实现
3、array,没有defineProperty方法,没有setter,通过get和新建数组方法拦截器修改原生方法push,pop,shift,unshift,splice,sort,reserve来实现监听,而通过修改数组下标操作数组的不会被检测,所以专门提供了$set和$delete来实现
4、$set(target, key, value)和$delete(target, propertyName/index)方法原理
(1)判断target是否是undefined,null,或者原始类型,或者vue实例,或者vue实例的跟数据对象
(2)target为数组,则还是通过调用splice操作索引更新数据
(3)target为对象,且为响应式,则调用defineReactive操作数据
(4)更新完数据后通知依赖更新
三、computed和watch和methods
1、computed
(1)设计初衷:为了使模板中的逻辑运算更简单
(2)适用于数据被重复使用或者计算复杂费时的场景;依赖其他数据的场景
(3)读取缓存,依赖不变,则不需重新计算。(根据dirty标志判断)
2、watch是对数据的监听回调
3、computed和watch的区别
相同点:都会观察页面的数据变化
不同点:(1)computed是读取缓存,watch每次都要重新执行;
(2)watch更适合数据变化时的异步操作和开销较大的操作。
4、computed和methods的区别
computed依赖缓存,可以定义getter和setter,但是methods不行
四、vue-router的模式区别
1、abstract:非浏览器环境下使用
2、hash:
(1)默认。监听hashchange实现。
(2)有点,兼容性好,ie8支持
(3)缺点:看起来奇怪
3、history:
(1)h5新增的。允许开发者直接修改前端路由而不重新触发请求页面
(2)实现原理:监听popstate事件。能监听到用户点击浏览器的前进后退事件或者手动调用go,back,forward事件;不能监听到pushState和replaceState事件。
(3)为了避免浏览器刷新出现的404页面,需要在服务端配置兼容。
(4)如果浏览器不支持,会降级到hash模式
*通过vue.use插件机制和vue.mixin将store在beforeCreate和destroyed生命周期进行混入。
五、vuex解决了什么问题
1、vuex解决了vue项目中的数据状态管理问题
2、是组件通信的一种方式。
3、原理:创建了单一的状态树,包含state,mutation,action,getter,module。
4、view(dispatch)action(commit)mutation(mutate)state(render)view
5、通过vue的data和computed,让state变成响应式,
6、通过vue.use插件机制和vue.mixin将store在beforeCreate生命周期进行混入。
六、nextTick是怎么是实现的
1、作用:将回调延迟到下次DOM更新循环之后执行
2、原因:VUE在更新DOM时是异步的,vue检测到数据变化后,不会立即更新DOM,而是会开启一个事件队列,并缓冲同一时间循环中的所有数据变更,在下一次tick中,执行更新DOM。
3、js的运行机制:js是单线程的,基于事件循环,有宏任务和微任务。
4、内部原理:
(1)能力检测:Promise.then(微), MutationObserve(微),setImmediate(微),setTimeout(宏)
(2)将回调函数推入回调队列,锁上易步锁,执行回调。
七、keep-alive内置组件和LRU算法(队列)
1、自身不会渲染成DOM,没有常规的标签,是个函数组件,被他包裹的组件,切换时会被缓存在内存中,而不是销毁。
(1)可以有条件的缓存:include(匹配到的缓存),exclude(匹配到的不缓存),max(最多可以缓存多少组件实例)
2、原理:内部维护了this.cache(缓存的组件对象)和this.keys(this.cache中的key),运用LRU策略。
(1)命中了缓存的组件要调整组件key的顺序。
(2)缓存的组件数量如果超过this.max时,要删除第一个缓存组件。
(3)LRU(Least recently used,最近最少使用):根据数据的历史访问记录来进行淘汰数据。“如果数据最近被访问过,那么将来被访问的几率也更高。”
3、生命周期钩子:activated和deactivated,被keep-alive包括的组件激活和停用时调用。先停用组件的deactivated,再激活组件的activated
怎样使用Vue页面骨架屏注入
这次给大家带来怎样使用Vue页面骨架屏注入,使用Vue页面骨架屏注入的注意事项有哪些,下面就是实战案例,一起来看一下。
作为与用户联系最为密切的前端开发者,用户体验是最值得关注的问题。关于页面loading状态的展示,主流的主要有loading图和进度条两种。除此之外,越来越多的APP采用了“骨架屏”的方式去展示未加载内容,给予了用户焕然一新的体验。随着SPA在前端界的逐渐流行,首屏加载的问题也在困扰着开发者们。那么有没有一个办法,也能让SPA用上骨架屏呢?这就是这篇文章将要探讨的问题。
文章相关代码已经同步到 Github,欢迎查阅~
一、何为骨架屏
简单来说,骨架屏就是在页面内容未加载完成的时候,先使用一些图形进行占位,待内容加载完成之后再把它替换掉。
这个技术在一些以内容为主的APP和网页应用较多,接下来我们以一个简单的Vue工程为例,一起探索如何在基于Vue的SPA项目中实现骨架屏。
二、分析Vue页面的内容加载过程
为了简单起见,我们使用 vue-cli搭配 webpack-simple这个模板来新建项目:
vue init webpack-simple vue-skeleton
这时我们便获得了一个最基本的Vue项目:
├── package.json
├── src
│├── App.vue
│├── assets
│└── main.js
├── index.html
└── webpack.conf.js安装完了依赖以后,便可以通过 npm run dev去运行这个项目了。但是,在运行项目之前,我们先看看入口的html文件里面都写了些什么。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>vue-skeleton</title>
</head>
<body>
<p id="app"></p>
<script src="/dist/build.js"></script>
</body>
</html>可以看到,DOM里
面有且仅有一个 p#app,当js被执行完成之后,此 p#app会被整个替换掉,因此,我们可以来做一下实验,在此p里面添加一些内容:
<p id="app">
<p>Hello skeleton</p>
<p>Hello skeleton</p>
<p>Hello skeleton</p>
</p>打开chrome的开发者工具,在 Network里面找到 throttle功能,调节网速为“Slow 3G”,刷新页面,就能看到页面先是展示了三句“Hello skeleton”,待js加载完了才会替换为原本要展示的内容。
现在,我们对于如何在Vue页面实现骨架屏,已经有了一个很清晰的思路——在 p#app内直接插入骨架屏相关内容即可。
三、易维护的方案
显然,手动在 p#app里面写入骨架屏内容是不科学的,我们需要一个扩展性强且自动化的易维护方案。既然是在Vue项目里,我们当然希望所谓的骨架屏也是一个.vue文件,它能够在构建时由工具自动注入到 p#app里面。
首先,我们在/src目录下新建一个 Skeleton.vue文件,其内容如下:
<template>
<p class="skeleton page">
<p class="skeleton-nav"></p>
<p class="skeleton-swiper"></p>
<ul class="skeleton-tabs">
<li v-for="i in 8" class="skeleton-tabs-item"><span></span></li>
</ul>
<p class="skeleton-banner"></p>
<p v-for="i in 6" class="skeleton-productions"></p>
</p>
</template>
<style>
.skeleton{
position: relative;
height: 100%;
overflow: hidden;
padding: 15px;
box-sizing: border-box;
background:#fff;
}
.skeleton-nav{
height: 45px;
background:#eee;
margin-bottom: 15px;
}
.skeleton-swiper{
height: 160px;
background:#eee;
margin-bottom: 15px;
}
.skeleton-tabs{
list-style: none;
padding: 0;
margin: 0-15px;
display: flex;
flex-wrap: wrap;
}
.skeleton-tabs-item{
width: 25%;
height: 55px;
box-sizing: border-box;
text-align: center;
margin-bottom: 15px;
}
.skeleton-tabs-item span{
display: inline-block;
width: 55px;
height: 55px;
border-radius: 55px;
background:#eee;
}
.skeleton-banner{
height: 60px;
background:#eee;
margin-bottom: 15px;
}
.skeleton-productions{
height: 20px;
margin-bottom: 15px;
background:#eee;
}
</style>接下来,再新建一个 skeleton.entry.js入口文件:
import Vue from'vue'
import Skeleton from'./Skeleton.vue'
export default new Vue({
components:{
Skeleton
},
template:'<skeleton/>'
})在完成了骨架屏的准备之后,就轮到一个关键插件 vue-server-renderer登场了。该插件本用于服务端渲染,但是在这个例子里,我们主要利用它能够把.vue文件处理成 html和 css字符串的功能,来完成骨架屏的注入,流程如下:
四、方案实现
根据流程图,我们还需要在根目录新建一个 webpack.skeleton.conf.js文件,以专门用来进行骨架屏的构建。
const path= require('path')
const webpack= require('webpack')
const nodeExternals= require('webpack-node-externals')
const VueSSRServerPlugin= require('vue-server-renderer/server-plugin')
module.exports={
target:'node',
entry:{
skeleton:'./src/skeleton.js'
},
output:{
path: path.resolve(dirname,'./dist'),
publicPath:'/dist/',
filename:'[name].js',
libraryTarget:'commonjs2'
},
module:{
rules: [
{
test:/\.css$/,
use: [
'vue-style-loader',
'css-loader'
]
},
{
test:/\.vue$/,
loader:'vue-loader'
}
]
},
externals: nodeExternals({
whitelist:/\.css$/
}),
resolve:{
alias:{
'vue$':'vue/dist/vue.esm.js'
},
extensions: ['*','.js','.vue','.json']
},
plugins: [
new VueSSRServerPlugin({
filename:'skeleton.json'
})
]
}可以看到,该配置文件和普通的配置文件基本完全一致,主要的区别在于其 target:'node',配置了 externals,以及在 plugins里面加入了 VueSSRServerPlugin。在 VueSSRServerPlugin中,指定了其输出的json文件名。我们可以通过运行下列指令,在/dist目录下生成一个 skeleton.json文件:
webpack--config./webpack.skeleton.conf.js
这个文件在记载了骨架屏的内容和样式,会提供给 vue-server-renderer使用。
接下来,在根目录下新建一个 skeleton.js,该文件即将被用于往 index.html内插入骨架屏。
const fs= require('fs')
const{ resolve}= require('path')
const createBundleRenderer= require('vue-server-renderer').createBundleRenderer
//读取`skeleton.json`,以`index.html`为模板写入内容
const renderer= createBundleRenderer(resolve(dirname,'./dist/skeleton.json'),{
template: fs.readFileSync(resolve(dirname,'./index.html'),'utf-8')
})
//把上一步模板完成的内容写入(替换)`index.html`
renderer.renderToString({},(err, html)=>{
fs.writeFileSync('index.html', html,'utf-8')
})注意,作为模板的 html文件,需要在被写入内容的位置添加<!--vue-ssr-outlet-->占位符,本例子在 p#app里写入:
<p id="app">
<!--vue-ssr-outlet-->
</p>接下来,只要运行 node skeleton.js,就可以完成骨架屏的注入了。运行效果如下:
<html lang="en">
<head>
<meta charset="utf-8">
<title>vue-skeleton</title>
<style data-vue-ssr-id="742d88be:0">
.skeleton{
position: relative;
height: 100%;
overflow: hidden;
padding: 15px;
box-sizing: border-box;
background:#fff;
}
.skeleton-nav{
height: 45px;
background:#eee;
margin-bottom: 15px;
}
.skeleton-swiper{
height: 160px;
background:#eee;
margin-bottom: 15px;
}
.skeleton-tabs{
list-style: none;
padding: 0;
margin: 0-15px;
display: flex;
flex-wrap: wrap;
}
.skeleton-tabs-item{
width: 25%;
height: 55px;
box-sizing: border-box;
text-align: center;
margin-bottom: 15px;
}
.skeleton-tabs-item span{
display: inline-block;
width: 55px;
height: 55px;
border-radius: 55px;
background:#eee;
}
.skeleton-banner{
height: 60px;
background:#eee;
margin-bottom: 15px;
}
.skeleton-productions{
height: 20px;
margin-bottom: 15px;
background:#eee;
}
</style></head>
<body>
<p id="app">
<p data-server-rendered="true" class="skeleton page"><p class="skeleton-nav"></p><p class="skeleton-swiper"></p><ul class="skeleton-tabs"><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li><li class="skeleton-tabs-item"><span></span></li></ul><p class="skeleton-banner"></p><p class="skeleton-productions"></p><p class="skeleton-productions"></p><p class="skeleton-productions"></p><p class="skeleton-productions"></p><p class="skeleton-productions"></p><p class="skeleton-productions"></p></p>
</p>
<script src="/dist/build.js"></script>
</body>
</html>可以看到,骨架屏的样式通过<style></style>标签直接被插入,而骨架屏的内容也被放置在 p#app之间。当然,我们还可以进一步处理,把这些内容都压缩一下。改写 skeleton.js,在里面添加 html-minifier:
...
+ const htmlMinifier= require('html-minifier')
...
renderer.renderToString({},(err, html)=>{
+ html= htmlMinifier.minify(html,{
+ collapseWhitespace: true,
+ minifyCSS: true
+})
fs.writeFileSync('index.html', html,'utf-8')
})来看看效果:
效果非常不错!至此,Vue页面接入骨架屏已经完全实现了。
相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
推荐阅读:
如何使用js封装ajax功能函数与用法
JS里常见内置函数使用详解
关于vue下一页,vue视频网站的介绍到此结束,希望对大家有所帮助。