1.安装nodejs服务器。
java 项目可以运行在 tomcat 服务器,开始完成前后端完全分离。前端有自己独立的工程。我们需 要把前端独立的工程运行起来。 --- 运行在 nodejs 服务器下。 理解为 tomcat 服务器 安装成功后在命令窗口查看1.1 安装npm
java 项目需要依赖 jar ,安装 maven 。 前端项目需要依赖第三方的插件。比如 axios elementui echarts 前端也需要一个管理组件的软件。 npm. 如果 package.json 文件 类似于 pom.xml 文件。 npm 通过该文件 package.json 文件安装依赖的插件。 如果安装了 node 默认 安装了 npm. 验证 : npm -v2. 安装vue cli的脚手架
帮你创建前端项目工程。它的安装需要依赖上面的npm
2.1 安装vue cli
npm install -g @vue/cli -g: global 全局 验证是否安装成功 : vue --version3. 使用vuecli搭建vue前端项目
第一种使用命令 : vue create 第二种使用图形化界面: vue ui3.1 安装相应的插件--elementui
安装插件有两种方式 : 第一种使用命令 : npm i element-ui -S 第二种使用图形化 :2.2 安装axios依赖
发送异步请求的。 第一种命令 : npm i -S axios 第二种图形化 : 如下4. 使用客户端软件打开vue工程
vscode [ 专业的前端工具 ] webstorm [idea 团队开发的软件 -- 只要会使用 idea 那么也会使用该工具 ] hbuilder [ 适合前端 ] 在 webstorm 中启动该项目 vue 原理5. 组件化开发
组件化:一个页面可以拆分成一个个组件,每个组件有着自己独立的结构 [html] 、样式 [css] 、行为 [js] 。 好处:便于维护,利于复用 → 提升开发效率。 组件分类:普通组件、根组件。 比如:下面这个页面,可以把所有的代码都写在一个页面中,但是这样显得代码比较混乱,难易维 护。咱们可以按模块进行组件划分6. 根组件 App.vue
1. 根组件介绍 整个应用最上层的组件,包裹所有普通小组件 2. 组件是由三部分构成 三部分构成 template :结构 (有且只能一个根元素) script: js 逻辑 style : 样式 ( 可支持 less ,需要装包 ) 让组件支持 less ( 1 ) style 标签, lang="less" 开启 less 功能 ( 2 ) 装包 : yarn add less less-loader -D 或者 npm i less less-loader -D7. 普通组件的注册使用
普通组件的注册有两种方式。 ( 1 )局部注册: ( 2 )全局注册 普通组件的注册使用 - 局部注册 1. 特点: 只能在注册的组件内使用 2. 步骤: 1. 创建 .vue 文件(三个组成部分) 2. 在使用的组件内先导入再注册,最后使用 3. 使用方式: 当成 html 标签使用即可 < 组件名 ></ 组件名 > 4. 注意: 组件名规范 —> 大驼峰命名法, 如 AAAHeader 5. 语法:// 导入需要注册的组件// import 组件对象 from '.vue文件路径'import AAAHeader from './components/AAAHeader'export default {• // 局部注册components: {'组件名': 组件对象,AAAHeader:AAAHeader,AAAHeader}}
普通组件的注册使用 - 全局注册 1. 特点: 全局注册的组件,在项目的 任何组件 中都能使用 2. 步骤 1. 创建 .vue 组件(三个组成部分) 2. main.js 中进行全局注册 3. 使用方式 当成 HTML 标签直接使用 < 组件名 ></ 组件名 > 4. 注意 组件名规范 —> 大驼峰命名法, 如 AAAHeader 5. 语法 Vue.component(' 组件名 ', 组件对象 ) 8. 组件通信
1. 什么是组件通信? 组件通信,就是指 组件与组件 之间的 数据传递 组件的数据是独立的,无法直接访问其他组件的数据。 想使用其他组件的数据,就需要组件通信 2. 组件之间如何通信 3. 组件关系分类 1. 父子关系 2. 非父子关系 5. 父子通信流程 1. 父组件通过 props 将数据传递给子组件 [ 重点 ] 2. 子组件利用 $emit 通知父组件修改更新 6. 父向子通信代码示例 父组件通过 props 将数据传递给子组件 父组件 App.vue 父向子传值步骤 1. 给子组件以添加属性的方式传值 2. 子组件内部通过 props 接收 3. 模板中直接使用 props 接收的值9.路由介绍
9.1.思考
单页面应用程序,之所以开发效率高,性能好,用户体验好 最大的原因就是: 页面按需更新 比如当点击【发现音乐】和【关注】时, 只是更新下面部分内容 ,对于头部是不更新的 要按需更新,首先就需要明确: 访问路径 和 组件 的对应关系! 0. 子组件向父组件传值 1. 什么是路由 2. 如何配置路由 3. 路由传参 4. 前端访问后端代码 5 访问路径 和 组件的对应关系如何确定呢? 路由 路由 : 就是路径和组件建立关联关系的过程。9.2 vue中如何使用路径
我们刚才演示了路由的基本使用。 --- 通过在地址栏输入路由地址,在根据路由配置找到对应的组 件,并渲染该组件。 ( 1 )第一种 : 声明式路径<router-link to="/login">登录</router-link>
( 2 )第二种 : 编码式路径 methods:{my(){//路由跳转---编码式路由this.$router.push("/register")}}
9.3. 路由传递
9.3.1 声明路由--查询参数
类似于之前 路由也是这种模式 对应的组件接受查询参数。 this.$route.query. 参数名9.3.2 声明路由--动态路由参数
2. 路由配置时 : { path="/ 路由路径 /: 参数名 "} 3. 相应的组件中接受参数值 this.$route.params. 参数名9.3.3 查询参数和动态路由参数
1. 查询参数传参 ( 比较适合传 多个参数 ) 1. 跳转: to="/path? 参数名 = 值 & 参数名 2= 值 " 2. 获取: this.$route.query. 参数名 2. 动态路由传参 ( 优雅简洁 ,传单个参数比较方便 ) 1. 配置动态路由: path: "/path/: 参数名 " 2. 跳转: to="/path/ 参数值 " 3. 获取: this.$route.params. 参数名 <router-link to="/login"> 登录 </router-link> 1 methods:{ my(){ // 路由跳转 --- 编码式路由 this.$router.push("/register") } } const originalPush = VueRouter.prototype.push // 修改原型对象中的 push 方法 VueRouter.prototype.push = function push(location) { return originalPush.call(this, location).catch(err => err) } 5 注意:动态路由也可以传多个参数,但一般只传一个 准备传递参数 --- 查询参数和动态路由参数9.3.4 编码路由--查询参数
my(){//路由跳转---编码式路由//简写版://this.$router.push("/my?name=ldh&age=18")//完整版this.$router.push({path: "/my",query:{name:"张嘉琪",age:88},})}
接受: created() {this.name=this.$route.query.name;this.age=this.$route.query.age;}
9.3.5 编码路由--动态路由参数
//动态路由参数--简介版// this.$router.push("/my/zcj")this.$router.push({// path:"/my", //表示路由的path的值name:"My", //表示路由的名称params:{key:"wzy"}})//path不能和params配合使用。 name可以和params配合使用
接受参数 //create()created() {this.name=this.$route.params.key;// this.name=this.$route.query.name;// this.age=this.$route.query.age;}
当出现NavigationDuplicated: Avoided redundant navigation to current location: "/register".问题时
解决方案 : /router/index.js 添加如下代码 Vue-Router3.0const originalPush = VueRouter.prototype.push//修改原型对象中的push方法VueRouter.prototype.push = function push(location) {return originalPush.call(this, location).catch(err => err)}