首页数码vue下一页(vue视频网站)

vue下一页(vue视频网站)

编程之家2026-05-171028次浏览

其实vue下一页的问题并不复杂,但是又很多的朋友都不太了解vue视频网站,因此呢,今天小编就来为大家分享vue下一页的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

vue下一页(vue视频网站)

vue-pdf只显示一页问题解决

在项目开发中,我遇到了一个使用vue-pdf显示PDF文件的问题,即只能加载显示第一页,以下是我的解决方法。

具体使用vue-pdf的方式如下:

在组件中进行使用时,发现多页PDF文件仅显示第一页。

通过查看vue-pdf的源码,我发现其实现原理是将PDF文件按页绘制到canvas上,其中page参数默认值为1,因此只展示了第一页的canvas内容。针对这个问题,我们可以采取以下两种方法解决:

第一种方法是使用v-for循环加载所有页面。

然而,如果PDF文件页数较多,这种方法会导致加载速度较慢。

vue下一页(vue视频网站)

第二种方法是采用分页的形式进行加载。

这种方式可以保证加载流畅,提升用户体验。

vue原理相关总结

一、vue2.0的双向绑定是怎么实现的

2、observer,compile,watcher

(1)observe是一个数据监听器,核心方法是Object.defineProperty

(3)compile是一个指令解析器,对需要监听的节点和属性进行扫描和解析。

vue下一页(vue视频网站)

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视频网站的介绍到此结束,希望对大家有所帮助。

excel最常用的八个函数 多个独立excel汇总到一张表网页模版,网页模板下载