文章目录
一.组件
组件 (Component) 是 Vue最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码
- 一句话总结组件: 组件就是自定义标签,它内部存储了很多html代码
1.1 组件的注意事项
- 先创建组件再进行挂载
- 组件的template有且只有一个外部标签
- 组件取名如果是驼峰命名,使用-表示
例: <myComponent> <my-component>
建议使用小写命名
1.2 全局组件(所有被挂载的地方都可以使用)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="node_modules/vue/dist/vue.min.js"></script>
</head>
<body>
<div id="app">
<mycomponent></mycomponent>
</div>
<div id="app2">
<mycomponent></mycomponent>
</div>
</body>
<script type="text/javascript">
/*
* 全局组件(所有被挂载的位置都可以使用)
* 组件注意事项:
* 1.有且只有一个外部标签
* 2.取名如果使用驼峰命名 -> 标签名称就要变成 my-tag {建议使用小写}
* 3.组件必需在挂载之前先声明
* */
Vue.component("mycomponent",{
template:"<div><h1>全局组件</h1><h2 style='color: red'>都是全局组件</h2></div>"
})
new Vue({
el:"#app"
})
new Vue({
el:"#app2"
})
</script>
</html>
1.3 局部组件(只有当前挂载的元素可以使用)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="node_modules/vue/dist/vue.min.js"></script>
</head>
<body>
<div id="app">
<mycomponent></mycomponent>
</div>
<div id="app2">
<mycomponent></mycomponent>
</div>
</body>
<script type="text/javascript">
new Vue({
el:"#app",
//这是一个局部组件
components:{
//组件名
mycomponent:{
//相应的模板
template: "<div><h1>局部组件</h1></div>"
}
}
})
new Vue({
el:"#app2"
})
</script>
</html>
1.4 组件模板
1.4.1 两种创建模板的方式
- 直接使用template标签
特别注意:在模板中获取数据必需是一个函数返回
<body>
<div id="app">
<!--如果template标签放到这里面,它默认就会使直接使用起来 -->
<mytag></mytag>
</div>
<!--直接添加一个组件标签 template里面的内容是不会显示出来的-->
<template id="mytemp">
<form method="post" action="">
用户:<input type="text" name="username"> <br />
密码:<input type="password" name="password"><br />
<button type="button" @click="say">{{msg}}</button>
</form>
</template>
</body>
<script type="text/javascript">
Vue.component("mytag",{
//这里直接引入tempate标签中的内容
template:"#mytemp",
//这里的数据需要写一个函数,进行返回
data(){
return {
msg:"...登陆..."
}
},
//这里定义模板的方法
methods:{
say(){
alert("登陆成功");
}
}
})
new Vue({
//挂载
el:"#app",
//数据
data:{
msg:"hello"
}
})
</script>
- 使用script标签
注意:必需加一个
type="text/template"
<body>
<div id="app">
<mytag></mytag>
</div>
<!--直接添加一个组件标签 template里面的内容是不会显示出来的-->
<script id="myjstemp" type="text/template">
<form method="post" action="">
用户:<input type="text" name="username"> <br />
密码:<input type="password" name="password"><br />
<input type="button" value="登录" />
</form>
</script>
</body>
<script type="text/javascript">
Vue.component("mytag",{
//这里直接引入script标签中的内容
template:"#myjstemp"
})
new Vue({
//挂载
el:"#app",
//数据
data:{
msg:"hello"
}
})
</script>
1.4.2 获取动态元素
组件要获取动态元素,它不是找的vue中的data属性,
而是找template中的data属性
模板中data对应的值,必须是一个函数
并且在函数内部返回的值必须是json对象
<body>
<div id="app">
<mycomponent></mycomponent>
</div>
<!--
注意:如果组件要获取动态元素,它不是找的vue中的data属性,而是找template中的data属性
模板中data对应的值,必须是一个函数 并且在函数内部返回的值必须是json对象
-->
<template id="mytemplate">
<h1>欢迎{{username}}登录系统 年龄:{{age}}</h1>
</template>
</body>
<script type="text/javascript">
//创建全局组件使用一个变量接受
Vue.component("mycomponent", {
template: "#mytemplate",
data:function(){
return {
username:"管理员",
age:18
}
}
});
//它不会找的vue中的data属性
new Vue({
el:"#app",
data:{
username:"admin"
}
})
</script>
三.Vue路由
路由是Vuejs中一个重要的插件
如果要使用路由功能需要引入路由的js代码
路由主要是为了构建单页面而存在的
现在有些网站就是使用路由方式完成的(比如:网易云音乐)
路由代码的步骤
- 引入js(vue的js与路由的js)
<!--vue js-->
<script type="text/javascript" src="node_modules/vue/dist/vue.min.js"></script>
<!--路由 js-->
<script type="text/javascript" src="node_modules/vue-router/dist/vue-router.min.js"></script>
- 准备路由的导航组件
router-link
- 准备路由出口(最后数据展示的位置)
router-view
- 定义路由对与对应的组件
- 进行路径的挂载
<body>
<div id="app">
<p>
<!-- 使用 router-link 组件来导航. -->
<!-- 通过传入 `to` 属性指定链接. 意思是你要跳转到什么地方 -->
<!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
<router-link to="/index">首页</router-link>
<router-link to="/employee">员工</router-link>
<router-link to="/department">员工</router-link>
</p>
<!-- 路由出口 -->
<!-- 路由匹配到的组件将渲染在这里 -->
<router-view></router-view>
</div>
</body>
<script type="text/javascript">
// 1. 定义 (路由) 组件。
// 可以从其他文件 import 进来
let INDEX = Vue.component("index", {
template: "<h1>首页</h1>"
});
let EMPLOYEE =Vue.component("employee", {
template: "<h1>员工</h1>"
});
let DEPARTMENT = Vue.component("department", {
template: "<h1>部门</h1>"
});
// 2. 定义路由
//path:这个路由的路径,这个路径和<router-link> to属性中的路径对应上
let router = new VueRouter({
routes:[
/*路径映射到组件*/
{path:"/index",component:INDEX},
{path:"/employee",component:EMPLOYEE},
{path:"/department",component:DEPARTMENT}
]
})
var app = new Vue({
el:"#app",
//告诉vue我要使用路由
router //router:router
})
</script>
四.生命周期钩子
每个 Vue 实例在被创建时都要经过一系列的初始化过程
:创建实例,装载模板,渲染模板等等。
Vue为生命周期中的每个状态都设置了钩子函数
(监听函数)。每当Vue实例处于不同的生命周期时,对应的函数就会被触发调用。
<body>
<div id="app">
</div>
</body>
<script type="text/javascript">
new Vue({
el:"#app",
data:{
msg:"你好"
},
methods:{
sayHello(){
alert("你好呀!")
}
},
//方法和数据已经初始化完毕,在created中可以调用data和methods中的内容
created(){
alert("created"+this.msg)
this.msg = "被修改了"
},
//挂载完毕
mounted(){
//整个vue初始化完毕
// 加载列表 渲染
// ajax请求发送到后台
alert("mounted"+this.msg)
}
})
</script>
五.计算属性和watch
5.1 计算属性
在插值表达式中使用js表达式是非常方便的,而且也经常被用到。
但是如果表达式的内容很长,就会显得不够优雅,而且后期维护起来也不方便
- 例如下面的场景,我们有一个日期的数据,但是是毫秒值:
data:{
birthday:1529032123201 // 毫秒值
}
- 方案1:我们在页面渲染,希望得到yyyy-MM-dd的样式:
- 虽然能得到结果,但是
非常麻烦
。
<div id="app">
<h1>您的生日是:{{
new Date(birthday).getFullYear() + '-'+ new Date(birthday).getMonth()+ '-' + new Date(birthday).getDay()
}}
</h1>
</div>
- 方案2:Vue中提供了
计算属性
,来替代复杂的表达式:
<body>
<div id="app">
<!--计算属性-->
<h1 style="color: red">您的生日是:{{birth}} </h1>
</div>
</body>
<script type="text/javascript">
new Vue({
el:"#app",
data:{
birthday:1529032123201 // 毫秒值
},
computed:{
birth(){// 计算属性本质是一个方法,但是必须返回结果
const d = new Date(this.birthday);
return d.getFullYear() + "-" + d.getMonth() + "-" + d.getDay();
}
}
})
</script>
5.2 watch
watch可以让我们
监控一个值的变化
。从而做出相应的反应
。
<body>
<div id="app">
<input type="text" v-model="msg">
</div>
</body>
<script type="text/javascript">
new Vue({
el:"#app",
data: {
msg:""
},
watch:{
msg(newVal, oldVal){
console.log(newVal, oldVal);
}
}
})
</script>
六.Webpack打包
Webpack
是一个前端资源加载/打包工具
。它将根据模块的依赖关系进行静态分 析,然后将这些模块按照指定的规则生成对应的静态资源。
- 将碎小文件打包成一个整体,减少单页面内的请求次数,提高网站效率。
- 将ES6的高级语法进行转换编译,以兼容老版本的浏览器。
- 将代码打包的同时进行
混淆
,提高代码的安全性。
6.1 使用
6.1.1 安装
-
本地安装:
npm install webpack --save-dev
npm install webpack-cli --save-dev
-
全局安装:–推荐使用
npm install -g webpack
(服务)
npm install -g webpack-cli
(客户端)
6.1.2 简单使用
- Js打包-入门
a.js
var a = "a模块";
var b = require('./b.js');
console.log(b);
b.js
define(function () {
var b = "b模块";
return b;
});
—amd 模式可以 但是commonjs必须在nodejs环境,浏览器环境不ok
打包:webpack src/a.js -o dist/bundle.js
Index.html
<script src="dist/bundle.js"></script>
- Js打包-配置文件
上面我们每次在打包的时候,都要输入 webpack src/a.js -o dist/bundle.js
这个命令,比较麻烦,所以我们可以按照下面的方式,新建一个js文件,到时候打包的时候,只需要运行webpack 命令就可以进行打包
webpack.config.js
,该文件与项目根处于同级目录
var path = require("path");
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './dist'),
filename: 'bundle.js'
}
}
6.2 Css加载
6.2.1 加载器
webpack 可以使用 loader 来预处理文件。这允许你打包除 JavaScript 之外的任何静态资源。你可以使用 Node.js来很简单地编写自己的 loader。
loader 通过在 require() 语句中使用 loadername! 前缀来激活,或者通过 webpack 配置中的正则表达式来自动应用
- vue-loader 转换vue组件 *.vue
- css-loader 加载css文件
- babel-loader 加载 ES2015+ 代码,然后使用 Babel 转译为 ES5
6.2.2 实现
- 步骤一:
npm install style-loader --save-dev
npm install css-loader --save-dev
- 步骤二:
a.js引入:
var a = "a模块";
var b = require('./b.js');
console.log(b);
require('../css/index.css')
- 步骤三:在webpack.config.js文件引入下面代码
var path = require("path");
module.exports = {
entry: './web/js/a.js',
output: {
path: path.resolve(__dirname, './dist'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.css$/, //匹配文件规则
use: ['style-loader', 'css-loader'] //匹配后使用什么加载器进行模块加载
// webpack use的配置,是从右到左进行加载的
},
]
}
}
- 步骤四:打包:webpack
6.3 热更新web服务器
刚才的案例中,我们都是
本地运行
。webpack给我们提供了一个插件,可以帮我们运行一个web服务
;
- 安装插件:npm install webpack-dev-server --save-dev
- 添加启动脚本 :
在package.json中配置script
"scripts": {
"dev": "webpack-dev-server --inline --progress --config ./webpack.conf.js", },
--inline:自动刷新
--hot:热加载
--port:指定端口
--open:自动在默认浏览器打开
--host:可以指定服务器的 ip,不指定则为127.0.0.1
npm run dev/test
出现错误之后
https://www.cnblogs.com/gqx-html/p/10756388.html
https://www.cnblogs.com/laraLee/p/9174383.html
"devDependencies": {
"css-loader": "^3.1.0",
"style-loader": "^0.23.1",
"webpack": "^3.10.0",
"webpack-dev-server": "^2.9.7"
},
在执行 npm install
七.Vue-cli 脚手架
在开发中,需要打包的东西不止是js、css、html。还有更多的东西要处理,这些插件和加载器如果我们一一去添加就会比较麻烦。
幸好,vue官方提供了一个快速搭建vue项目的脚手架
:vue-cli
使用它能快速的构建一个web工程模板
。
官网:https://github.com/vuejs/vue-cli
安装命令:npm install -g vue-cli
7.1 Vue-cli 快速上手
- 新建一个项目
- 安装vue-cli
- vue-cli快速创建webpack项目
- 运行
npm run dev
npm run build
打包可以在服务器运行运行后 直接访问http://localhost:8080