vue 多页面多模块分模块打包 分插件安装_Vue渲染方式

74ce513fb45eca9a5ada46b927b6efdd.png

Vue中的渲染方式总结可分四种:

  • 原有模板语法,挂载渲染
  • 使用render属性,createElement函数直接渲染
  • 使用render属性,配合组件的template属性,createElement函数渲染
  • 使用render属性,配合单文件组件,createElement函数渲染

方式一

原有模板语法,挂载渲染:就是对使用Vue标签语法的hmtl进行渲染。

实例代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>TestVue</title>
</head>
<body>
<div id="app"><input v-model="message"><p>Message is: {{ message }}</p>
</div>
</body>
<script src="js/vue.js"></script>
<script type="text/javascript">var v = new Vue({el: '#app',data: {message: '这是内容'}});
</script>
</html>

特点

当页面返回时html中的v-model等属性并没有被渲染,保持不变发给客户端,客户端直到加载了Vue,创建了实例之后才会将这些标识渲染出来。

v-if显示后消失或消失后显示造成跳变

这种方式的缺点是明显的:浏览器第一时间无法识别这些标识!这会使得在某些情况下出现奇怪的现象,下面我修改代码以做演示:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>TestVue</title>
</head>
<body>
<div id="app"><template v-if="type === '1'"><div style="width: 400px;height: 300px;background-color: blue;"></div></template><div style="width: 400px;height: 200px;background-color: red;"></div>
</div>
</body>
<script src="js/vue.js"></script>
<script type="text/javascript">var v = new Vue({el: '#app',data: {type: '1'}});
</script>
</html>

可以看到上面的第一个div在type为1时应该显示,但是它在页面初始加载是不会显示的,一个html并没有<template>标签,整个标签会被跳过,那么这个页面展示的结果就会有一个一瞬间的跳变。

这个过程非常短,但是人眼是绝对识别得到的,在谷歌浏览器下使用Ctrl+Shift+R,360浏览器下使用Ctrl+F5强制不使用缓存加载页面我们就能看到这个跳变了!

注意另一种写法也会有跳变情况:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>TestVue</title>
</head>
<body>
<div id="app"><div v-if="type === '1'" style="width: 400px;height: 300px;background-color: blue;"></div><div style="width: 400px;height: 200px;background-color: red;"></div>
</div>
</body>
<script src="js/vue.js"></script>
<script type="text/javascript">var v = new Vue({el: '#app',data: {type: '2'}});
</script>
</html>

解释:div默认不会识别v-if默认显示,但是tpye为2,Vue加载后隐藏了该div,造成跳变。

如何解决跳变问题?

使用下面所有方法都可以解决,思路是用render函数进行渲染,而目标div内不含任何内容,也就是先什么都不显示,然后渲染出来正确的html,自然不会有跳变。

方式二

使用render属性,createElement函数直接渲染:原本无html,通过JavaScript 的完全编程的能力生成页面。

实例代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>TestVue</title>
</head>
<body>
<div id="app">
</div>
</body>
<script src="js/vue.js"></script>
<script type="text/javascript">var v = new Vue({el: '#app',data: {message: '这是内容'},render: function (createElement) {return createElement('p', 'Message is:' + this.message)}});
</script>
</html>

这里目标div内初始时没有任何内容,使用render方法生成内容,这里我没有渲染出v-model的效果,因为实现起来比较复杂,要用到组件,具体参考官网渲染函数 & JSX,Vue 的模板实际是就是被编译成了 render 函数。

这里render不要使用ECMAScript6语法如下:

render: h => h('p', this.message)

因为在ECMAScript6语法中,这里的this会指向[object Window],这个this.message是获取不到值的,而在上面一个的例子中this会指向当前Vue实例。

特点

极少会使用的方式,只适合一些细节渲染,虽完全控制输出,但不够直观,实现复杂,远不及模板标记语法:让Vue去帮我们编译渲染。

方式三

使用render属性,配合组件的template属性,createElement函数渲染。

相比于上一个方式,加入组件,利用template属性,更为直观,同样是原本无html,通过render函数渲染。

实例代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>TestVue</title>
</head>
<body>
<div id="app">
</div>
</body>
<script src="js/vue.js"></script>
<script type="text/javascript">var MyComponent = {data () {return {message: '这是内容'}},template: `<div id="app"><input v-model="message"><p>Message is: {{ message }}</p></div>`};var v = new Vue({el: '#app',components: {'my-component': MyComponent},render: function (createElement) {return createElement('my-component')}//ECMAScript6: render: h => h('my-component')});
</script>
</html>

这里渲染组件时的渲染的内容会覆盖原<div id="app"></div>,而不是在其之下生成子节点。

特点

动态渲染,并且通过组件实现了模块分离,但是html模板被包在````里,使用不方便,IDE无法高亮代码,不适合大型项目。

下面是官网上对于这种方式的描述:

  • 全局定义 (Global definitions) 强制要求每个 component 中的命名不得重复(上面我用的是局部注册组件,甚至组件和实例不能分文件)
  • 字符串模板 (String templates) 缺乏语法高亮,在 HTML 有多行的时候,需要用到丑陋的
  • 不支持 CSS (No CSS support) 意味着当 HTML 和 JavaScript 组件化时,CSS 明显被遗漏
  • 没有构建步骤 (No build step) 限制只能使用 HTML 和 ES5 JavaScript, 而不能使用预处理器,如 Pug (formerly Jade) 和 Babel

方式四

说了前三种方式,其实只是一步步引出第四种方式:使用render属性,配合单文件组件,createElement函数渲染。

这种方式是绝大部分Vue项目(官方脚手架就是采用该渲染方式)的渲染方式。

在理解这一部分内容之前,你需要有webpack、vue-loader的知识:

1、webpack是核心,将组件文件打包,配合loader解析文件。

2、vue-loader是vue单文件组件的核心,负责解析.vue文件。

webpack以及loader

webpack,一种打包文件工具,配合一些插件可以模块化文件的打包处理等,我也是边学边做,自行百度了解。

loader,webpack非常常用的属性,让你能配合各种loader随意加载各种东西,看下官网给出的解释:

loader 用于对模块的源代码进行转换。loader 可以使你在 import 或"加载"模块时预处理文件。因此,loader 类似于其他构建工具中“任务(task)”,并提供了处理前端构建步骤的强大方法。loader 可以将文件从不同的语言(如 TypeScript)转换为 JavaScript,或将内联图像转换为 data URL。loader 甚至允许你直接在 JavaScript 模块中 import CSS文件!

比如这里我们有.vue模块组件,我们要在另一个文件中import App from './App.vue'该如何做到,我一步步讲。

实现步骤

我是使用命令的方式先打包出一个目标文件,再运行服务器,好像可以写到package.json的'scripts'字段里做一个步骤的简化,我没试,还是最简单的方式吧。

1、我是用命令行打包所以先全局安装webpack,注意webpack4.0+版本后要附带安装一个webpack-cli或是webpack-command其中之一,我是安的webpack-command:

npm install webpack webpack-command -g

2、因为babel-loader、vue-loader等必须要有webpack,好像不在项目中载入webpack也不行,所以进入项目根目录(node_modules文件夹所在目录),npm install webpack --save在项目中加载webpack。

3、接着,再把需要的loader加载一下,首先是vue-loader,是解析.vue文件的核心loader,接着是babel-loader,它是用来修改不兼容的javaScript语法的loader,用来处理.vue文件中的<script></script>,还有处理<style></style>的css-loader、vue-style-loader,还有vue-loader强制附带个vue-template-compiler,我不知道是干嘛的。

加载babel:npm install babel-loader babel-core babel-preset-env --save

加载其他必要的:npm install vue-loader css-loader vue-style-loader vue-template-compiler --save

4、在根目录下新建一个名为dist的文件夹存放生成的文件。

5、在根目录下新建文件App.vue,这就是单文件组件了,而且是根组件,添加代码如下:

<template><div id="app"><input v-model="message"><p>Message is: {{ message }}</p></div>
</template><script>
export default {data () {return {message: 'dsdsadasad'}}
}
</script>

6、在根目录下新建webpack打包入口文件entry-client.js,添加代码如下:

import Vue from 'vue' //注意在静态编译时全都使用import,不要使用require,无法生效
import App from './App' //注意在静态编译时全都使用import,不要使用require,无法生效const app = new Vue({components: {App},render: h => h(App)
});app.$mount('#app');

7、在根目录下新建一个名为build的文件夹,在该文件夹内创建一个文件名为webpack.config.js的文件作为webpack配置文件,代码如下:

const path = require('path')
const VueLoaderPlugin = require('vue-loader/lib/plugin')module.exports = {entry: {'client.bundle': '../entry-client.js',},output: {path: path.resolve(__dirname, '../dist'), //生成文件放到dist目录下filename: '[name].js'},mode: 'development', //开发模式,有错误vue会在控制台提示resolve: {//加了下面这项我们就能将import App from './App.vue' 省略为import App from './App'extensions: ['.js', '.vue', '.json']},//设置loader以及插件,可参考vue-loader官网module: {rules: [{test: /.vue$/,loader: 'vue-loader'},// 它会应用到普通的 `.js` 文件// 以及 `.vue` 文件中的 `<script>` 块{test: /.js$/,loader: 'babel-loader'},// 它会应用到普通的 `.css` 文件// 以及 `.vue` 文件中的 `<style>` 块{test: /.css$/,use: ['vue-style-loader','css-loader']}]},plugins: [// 请确保引入这个插件来保证vue-loader的使用new VueLoaderPlugin()]
};

8、命令行进入build文件夹,输入命令webpack打包文件,然后就可以在dist目录下看到生成的client.bundle.js目标文件了。

9、在根目录下创建测试文件index.html,添加代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>TestVue</title>
</head>
<body>
<div id="app">
</div>
</body>
<script type="text/javascript" src="dist/client.bundle.js"></script>
</html>

特点

单文件组件,模块化,动态渲染,典型的单页面应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零配置 之 Spring注解实现Bean定义

转载自 零配置 之 12.3 注解实现Bean定义 ——跟我学spring3 12.3 注解实现Bean定义 12.3.1 概述 前边介绍的Bean定义全是基于XML方式定义配置元数据&#xff0c;且在【12.2注解实现Bean依赖注入】一节中介绍了通过注解来减少配置数量&#xff0c;但并没有完全消除在XML…

开源库 Natasha2016 ,让IL编程跑起来

背景&#xff1a; IL编程在普通的程序员的代码里几乎不会出现&#xff0c;但从Json.net、Dapper、Asp.net等等开源项目都体现出了IL编程的重要性。 在IL编程的时候&#xff0c;上百行甚至上千行的IL代码实在让人头大&#xff0c;调试不方便不说&#xff0c;IL编程的逻辑也是不同…

代码随想录27期|Python|Day24|回溯法|理论基础|77.组合

图片来自代码随想录 回溯法题目目录 理论基础 定义 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。回溯函数也就是递归函数&#xff0c;指的都是一个函数。 基本问题 组合问题&#xff08;无序&…

指纹识别软件安装包下载

微信关注公众号&#xff1a;1111的博客&#xff0c;回复“指纹识别”&#xff0c;即可获取指纹识别安装包的下载链接。本软件的版本为指纹识别2.0应用程序&#xff0c;在安装的过程中有以下几个注意点【一定要看】&#xff1a;安装完成之后直接运行&#xff1a;指纹识别.exe文件…

2016蓝桥杯省赛---java---B---2(生日蜡烛)

题目描述 生日蜡烛 思路分析 代码实现(方式一) package com.atguigu.TEST;class Main{public static void main(String[] args) {int sum236;int a0;//记录开始过生日的年龄for (int i 0; i < 100; i) {for (int j i; j < 100; j) {aaj;if(asum){System.out.printl…

ntp时间同步会导致mysql关闭吗?_ntp时间同步问题解决方法

http://www.pool.ntp.org/zone/asia0.asia.pool.ntp.org1.asia.pool.ntp.org2.asia.pool.ntp.org3.asia.pool.ntp.org2.1 注册表信息修改PDC配置外部时间源设置#config external NTP serverw32tm.exe /config /manualpeerlist:”0.asia.pool.ntp.org,1.asia.pool.ntp.org,2.asi…

javaSE视频教程正式启动

亲爱的小伙伴们&#xff1a;经过激烈的思想斗争之后&#xff0c;我决定了&#xff0c;决定什么呢&#xff1f;决定给大家送福利了&#xff01;对&#xff0c;是送福利了&#xff01;送什么福利呢&#xff1f;送教程&#xff0c;javaSE的教程免费送&#xff0c;主要还是由我来讲…

快速搭建本地 .NET Core 运行时调试环境

需要的软件环境&#xff1a; Oracle VM VirtualBoxCentOS 7llvm lldb 3.6.0 (3.5.0我试过 dumpobj时候一直报无效参数 Invalid parameter T_T) 先在VirtualBox创建新虚机&#xff1a;一路 Next &#xff0c;文件位置可以自定义下(默认是在Users/当前用户/.. 目录下)创建完选在设…

背包问题+图解

图解 代码实现 package com.atguigu.dynamic;/*** 创建人 wdl* 创建时间 2021/4/3* 描述*/ public class KnapsackProblem {public static void main(String[] args) {int[] w{1,4,3};//物品的重量int[] val{1500,3000,2000};//物品的价值 这里的val[i]就是前面的v[i]int m4;/…

java循环结构教程

循环的语法我发一下&#xff1a;while( 布尔表达式 ) {//循环内容}do {//代码语句}while(布尔表达式);for(初始化; 布尔表达式; 更新) {//代码语句}今天录制了一下java 的循环结构视频&#xff0c;包括while,do while以及for循环&#xff0c;时间有点长&#xff0c;所以大家看的…

想和你一起为 Visual Studio 庆祝20岁生日

Visual Studio Live 倒计时开始…… 1997年1月28日&#xff0c;Visual Stuido 97正式推出&#xff0c;她将Visual Basic、Visual C、Visual J、Visual Foxpro、Visual InterDev聚合在一起&#xff0c;并且这个让人着迷的“小妖精”&#xff0c;统揽天下20年尚未有退位的意思。 …

2016蓝桥杯省赛---java---B---3(凑算式)

题目描述 凑算式 思路分析 通分 代码实现 package com.atguigu.TEST;class Main{static int a[]{1,2,3,4,5,6,7,8,9};static int ans;public static boolean check(){int xa[3]*100a[4]*10a[5];int ya[6]*100a[7]*10a[8];if((a[1]*ya[2]*x)%(y*a[2])0&&a[0](a[1…

微软.NET年芳15:我在Azure上搭建Photon服务器(C#.NET)

摘录网上的“.NET 15周年”信息如下&#xff1a; 微软的 .NET 框架本周迎来了 15 岁生日。.NET 的第一个版本在 2002 年 2 月 13 日作为的 Visual Studio.NET 的一部分首次公开亮相。过去 15 年&#xff0c;.NET 框架从一个流行的闭源软件开发平台&#xff0c;变成了一个开源的…

分治算法---汉诺塔

思路分析 代码实现 package com.atguigu.dac;public class Hanoitower {public static void main(String[] args) {hanoiTower(5,A,B,C);}//汉诺塔移动的方法//使用分治算法public static void hanoiTower(int num,char a,char b,char c){//如果只有一个盘if(num1){System.out…

.NET Core跨平台:使用.NET Core开发一个初心源商城总括

1..NET Core基本介绍 a 作为一个.NET的开发者&#xff0c;在以前的开发中&#xff0c;我们开发的项目基本都是部署在windows服务器上,但是在windows服务器上的话某些比较流行的解决访问量的方案基本都是先出现在linux上&#xff0c;而后才能迁移出现windows上&#xff0c;而且效…

二分查找非递归方式实现

思路分析 代码实现 package com.atguigu.binarysearchnorecursion;/*** 创建人 wdl* 创建时间 2021/4/2* 描述*/ public class BinarySearchNoRecur {public static void main(String[] args) {//测试int[] arr{1,3,8,10,11,67,89};int i binarySearch(arr,67);System.out.pr…

jQuery实现判断li的个数从而实现其他功能

需求&#xff1a;当ul中的li大于6个的时候显示图片&#xff0c;当li小于6个的时候隐藏图片&#xff0c;先来看看效果&#xff1a; 当有7个li的时候&#xff1a; 当有3个li的时候&#xff1a; 现在吧源码放上来&#xff1a; <!DOCTYPE html> <html><head…

windows mysql memcached_Memcached在Windows下的安装

前言 &#xff1a; 简介下 Memcached 和 Memcache 的区别和联系Memcached和Memcache的区别&#xff0c;其实很简单&#xff0c;一个是服务端&#xff0c;一个是客户端&#xff0c;就像mysql一样&#xff0c;我们在命令行里输入各种sql语句就能查询到需要的结果&#xff0c;这就…

辅助Visual Studio 2017部署的DevOps新工具

我们能看到Visual Studio 2017中的一个重大改进是对安装程序做了完全重写。前期的Visual Studio构建版本都是大一统的&#xff0c;完成安装需要相当长的时间和大量的磁盘空间。因此有需求要对安装过程做一些改进&#xff0c;这在本质上需要改进Visual Studio及其组件的检测方式…

2016蓝桥杯省赛---java---B---6(方格填数)

题目描述 方格填数 思路分析 全排列检查 代码实现 package com.atguigu.TEST;import static java.lang.Math.abs;class Main{static int a[]{0,1,2,3,4,5,6,7,8,9};static int ans;public static boolean check(){if (abs(a[0] - a[1]) 1 || abs(a[0] - a[3]) 1 || abs…