vue入门笔记


VUE入门

页面基础组件参考文档;(3条消息) 一篇文章,Vue快速入门!!!_cV展示的学习园-CSDN博客

Axios异步通信

Axios简介

Axios是一个开源的可以用在浏览器端和Node JS的异步通信框架, 她的主要作用就是实现AJAX异步通信,其功能特点如下:

  • 从浏览器中创建XMLHttpRequests
  • 从node.js创建http请求
  • 支持Promise API[JS中链式编程]
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换JSON数据
  • 客户端支持防御XSRF(跨站请求伪造)

由于Vue.js是一个视图层框架并且作者(尤雨溪) 严格准守SoC(关注度分离原则)所以Vue.js并不包含AJAX的通信功能, 为了解决通信问题, 作者单独开发了一个名为vue-resource的插件, 不过在进入2.0版本以后停止了对该插件的维护并推荐了Axios框架。

由于jQuery操作Dom太频繁,所以少用

测试Axios

  • 准备数据
{
  "name": "cv战士",
  "url": "https://blog.csdn.net/qq_45408390?spm=1001.2101.3001.5343",
  "page": 1,
  "isNonProfit": true,
  "address": {
    "street": "含光门",
    "city": "陕西西安",
    "country": "中国"
  },
  "links": [
    {
      "name": "bilibili",
      "url": "https://bilibili.com"
    },
    {
      "name": "cv战士",
      "url": "https://blog.csdn.net/qq_45408390?spm=1001.2101.3001.5343"
    },
    {
      "name": "百度",
      "url": "https://www.baidu.com/"
    }
  ]
}
  • 测试代码
<!DOCTYPE html>
<html lang="en" xmlns:v-binf="http://www.w3.org/1999/xhtml" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--v-cloak 解决闪烁问题-->
    <style>
        [v-cloak]{
            display: none;
        }
    </style>
</head>
<body>
<div id="vue" v-cloak>
    <div>地名:{{info.name}}</div>
    <div>地址:{{info.address.country}}--{{info.address.city}}--{{info.address.street}}</div>
    <div>链接:<a v-bind:href="info.url">{{info.url}}</a> </div>
</div>

<!--引入js文件-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script type="text/javascript">
    var vm = new Vue({
        el:"#vue",
        //data:属性:vm
        data(){
            return{
                info:{
                    name:null,
                    address:{
                        country:null,
                        city:null,
                        street:null
                    },
                    url:null
                }
            }
        },
        mounted(){//钩子函数
            axios
                .get('../data.json')
                .then(response=>(this.info=response.data));
        }
    });
</script>
</body>
</html>

计算属性、内容分发

自定义事件

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--view层,模板-->
<div id="vue">
    <todo>
        <todo-title slot="todo-title" v-bind:title="title"></todo-title>
        <todo-items slot="todo-items" v-for="(item,index) in todoItems"
                    :item="item" :index="index" v-on:remove="removeItems(index)"></todo-items>
    </todo>
</div>
<!--1.导入Vue.js-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script type="text/javascript">
    Vue.component('todo',{
        template:'<div>\
                <slot name="todo-title"></slot>\
                <ul>\
                    <slot name="todo-items"></slot>\
                </ul>\
            </div>'
    });
    Vue.component('todo-title',{
        props:['title'],
        template:'<div>{{title}}</div>'
    });
    //这里的index,就是数组的下标,使用for循环遍历的时候,可以循环出来!
    Vue.component("todo-items",{
        props:["item","index"],
        template:"<li>{{item}}---{{index}}<button @click='remove'>删除</button></li>",
        methods: {
            remove: function (index) {
                this.$emit('remove',index);
            }
        }
    });
    var vm = new Vue({
        el:"#vue",
        data:{
            title:"cvzhanshi study java",
            todoItems:['test1','test2','test3']
        },
        methods: {
            removeItems: function (index) {
                this.todoItems.splice(index,1);
            }
        }
    });
</script>
</body>
</html>

通过上诉代码我们可以发现一个问题,如果删除操作要在组件中完成,那么组件如何删除Vue实例中的数据?

例:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6cl2ga6d-1624517862625)(Vue.assets/1624501228359.png)]

删除按钮是在组件中的,点击删除按钮删除对应的数据。

阅读Vue教程可知,此时就涉及到参数传递与事件分发了, Vue为我们提供了自定义事件的功能很好的帮助我们解决了这个问题; 组件中使用this.$emit(‘自定义事件名’, 参数) ,而在视图层通过自定义事件绑定Vue中的删除操作的方法

splice()方法是修改array的“万能方法”,他可以从指定的索引开始删除若干个元素,然后再从改位置添加若干个元素:

var arr = [ 'microsoft ', 'Apple ', 'Yahoo ', 'AOL', 'Excite ', 'oracle'];
//从索引2开始删除3个元素,然后再添加两个元素:
arr.splice(2,3,'6oogle ', 'Facebook ' );//返回删除的元素['Yahoo', 'AoL ', 'Excite']
arr; //[ 'Microsoft ', 'Apple ', 'Google', 'Facebook ', 'oracle ' ]
//只删除,不添加:
arr.splice( 2,2);  //[ 'Google ', 'Facebook ' ]
arr; //[ 'Microsoft ', ' Apple ', 'oracle ']
//只添加,不删除:
arr.splice(2,0,y'6oogle ', 'Facebook ' );//返回[],因为没有删除任何元素
arr; // [ 'Microsbft ', 'Apple ' , 'Google ', 'Facebook ', 'oracle ' ]
image-20211114150750509

Vue入门小结

核心:数据驱动,组件化

优点:借鉴了AngularJS的模块化开发和React的虚拟Dom,虚拟Dom就是把Demo操作放到内存中执行;

常用的属性:

  • v-if
  • v-else-if
  • v-else
  • v-for
  • v-on绑定事件,简写@
  • v-model数据双向绑定
  • v-bind给组件绑定参数,简写:

组件化

  • 组合组件slot插槽
  • 组件内部绑定事件需要使用到this.$emit(“事件名”,参数);
  • 计算属性的特色,缓存计算数据

遵循SoC关注度分离原则,Vue是纯粹的视图框架,并不包含,比如Ajax之类的通信功能,为了解决通信问

题,我们需要使用Axios框架做异步通信;

node.js(环境)

  • 检查node.js环境
C:\Users\XXXX>node -v
v16.11.1

C:\Users\XXXX>npm -v
8.0.0

  • 淘宝镜像加速
# -g 就是全局安装
npm install cnpm -g

# 或使用如下语句解决npm速度慢的问题,但是每次install都需要(妈发)
npm install --registry=https://registry.npm.taobao.org

尽量不用淘宝的可能会打包失败

  • 安装vue-cli
cnpm instal1 vue-cli-g
#测试是否安装成功#查看可以基于哪些模板创建vue应用程序,通常我们选择webpack
vue list

C:\Users.......\AppData\Roaming\npm\node_modules

image-20211113170836729

第一个vue项目

1、创建一个vue项目一路选no

C:\Users\CengXingPeng\Desktop\vue>vue init webpack myvue

? Project name myvue			//项目名字
? Project description A Vue.js project  //一个vue项目
? Author newcxp		//作者名
? Vue build standalone
? Install vue-router? No
? Use ESLint to lint your code? No
? Set up unit tests No
? Setup e2e tests with Nightwatch? No
? Should we run `npm install` for you after the project has been created? (recommended) no

   vue-cli · Generated "myvue".

# Project initialization finished!
# ========================

To get started:

  cd myvue
  npm install (or if using yarn: yarn)
  npm run dev

Documentation can be found at https://vuejs-templates.github.io/webpack


2、初始化vue项目

​ cd myvue
npm install (or if using yarn: yarn)
npm run dev

运行成功

PS C:\Users\....\Desktop\vue\myvue> npm run dev

> myvue@1.0.0 dev
> webpack-dev-server --inline --progress --config build/webpack.dev.conf.js

(node:7752) [DEP0111] DeprecationWarning: Access to process.binding('http_parser') is deprecated.
(Use `node --trace-deprecation ...` to show where the warning was created)
 13% building modules 25/29 modules 4 active ...ingPeng\Desktop\vue\myvue\src\App.vue{ parser: "babylon" } is deprecated; we now treat it as { parser: "babel" }.
 95% emitting

 DONE  Compiled successfully in 3719ms                                                                                                                                       下午5:42:26

 I  Your application is running here: http://localhost:8080


修改端口号

image-20211113174607274

安装WebPack

WebPack 是一款模块加载器兼打包工具,它能把各种资源,如JS、JSX、ES6、SASS、LESS图片等都作为模块来处理和使用

npm install webpack -g
npm install webpack-cli -g

测试安装是否成功

  • webpack -v
  • webpack-cli -v
  • image-20211113181452828

配置

创建webpack.config.js配置文件

  • entry: 入口文件,指定WebPack 用哪个文件作为项目的入口
  • output:输出,指定WebPack 把处理完成的文件放置到指定路径
  • module:模块,用于处理各种类型的文件
  • plugins:插件,如:热更新、代码重用等
  • resolve:设置路径指向
  • watch:监听,用于设置文件改动后直接打包

使用Webpack

1、创建文件用IEDA打开

image-20211113181951840

2、创建一个名为modules的目录。用于放置JS模块等资源文件

3、在modules字下创建文件,如hello.js 用于编写JS相关代码

//暴露一个方法 sayhi
exports.sayhi=function (){
    document.write("<h1>hello webpack</h1>")
}

4、在modules目录下创建一个main.js的入口文件用于打包是设置entry属性

//暴露一个方法 sayhi
exports.sayhi=function (){
    document.write("<h1>hello webpack</h1>")

5、在项目目录下创建webpack.config.js配置文件使用webpack命令打包

module.exports={
    entry:"./modules/main.js",
    output:{
        filename:"./js/bundle.js"
    },
    mode: 'development'//设置开发环境
};

注意:webpack.config.js文件中必须陪配置开发环境不然报错mode: 'development'

运行过程

image-20211113190506694

image-20211113180824942

vue vue-router

​ Vue Router是 Vue.js官方的路由管理器。它和Vue.js的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:

  • 嵌套的路由/视图表
  • 模块化的。基于组件的路由配置
  • 路由的参数、查询、通配符
  • 基于Vue.js过渡系统的视图过渡效果
  • 细粒度的导航控制
  • 带有自动激活的CSS class的链接
  • HTML5历史模式或hash 模式,在IE9中自动降级自定义的滚动条行为

安装

基于第一个vue-cli进行测试;先查看node_modules中是否存在vue-router

​ vue-router是一个插件包,所以我们还需要用npm/cnpm来进行安装。打开命令行工具进入项目目录输入

npm install vue-router  --save-dev

如果在模块工程中使用它,必须通过Vue.use()明确地安装路由功能

import Vue from 'vue'
import VueRouter from 'vue-router'
//安装路由
Vue.use(VueRouter)

测试 参考文档(3条消息) 一篇文章,Vue快速入门!!!_cV展示的学习园-CSDN博客

Vue+elementUI

创建工程

注意命令行都要使用管理员模式运行

  1. 创建一个hello-vue工程 vue init webpack hello-vue
  2. 安装依赖 vue-routerelementUIsass-loader、和node-sass
# 进入项目工程 
cd hello-vue
#安装 vur-router
npm install vue-router  --saver-dev
# 安装elementUI
npm i element-ui -s
#安装依赖
npm install
#安装SASS加载器
cnpm install sass-loader node-sass --save-dev
#启动测试
npm run dev

Npm命令解释

  • npm install moduleName:安装到模块的目录下
  • npm install -g moduleName :-g 的意思是将模块安装到全局、具体安装到那个磁盘的那个位置要看npm config prefix的位置
  • npm install -save moduleName : --save 的意思是将模块安装到项目目录下,并在package 文件的dependencies节点写入依赖,-S为该命令的缩写
  • npm install -save-dev moduleName: --save-dev的意思是将模块安装到项目目录下在 package 文件的devDependencies节点写入依赖,-D为该命令的缩写
  1. 创建视图字在views目录下创建一个名为login.vue的视图组件,其el-*的元素为ElementUI的组件

  2. 自动生成doc的网站文档化 (docsify.js.org)

引入 Element

你可以引入整个 Element,或是根据需要仅引入部分组件。我们先介绍如何引入完整的 Element。

完整引入

在 main.js 中写入以下内容:

import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import App from './App.vue'

Vue.use(ElementUI)

new Vue({
  el: '#app',
  render: h => h(App)
})

注意:运行报错

image-20211113235711268

可能是sass版本过高需要回退版本

image-20211113235921293 image-20211114000028874

修改版本后从新npm install

#先卸载node-sass
npm uninstall node-sass
#再重装4.x版本的node-sass
npm install node-sass@4.14.1

如果node.js版为16+ [https://blog.csdn.net/sinat_38592878/article/details/110387262]:用dart-sass(sass)代替

多路由嵌套

嵌套路由又称子路由,在实际应用中,通常由多层嵌套的组件组合而成

  • 创建用户信息组件,在 views/user 目录下创建一个名为 Profile.vue 的视图组件
<template>
  <h1>个人信息</h1>
</template>
<script>
  export default {
    name: "UserProfile"
  }
</script>
<style scoped>
</style>
  • 在用户列表组件在 views/user 目录下创建一个名为 List.vue 的视图组件
<template>
  <h1>用户列表</h1>
</template>
<script>
  export default {
    name: "UserList"
  }
</script>
<style scoped>
</style>

  • 修改首页视图,我们修改 Main.vue 视图组件,此处使用了 ElementUI 布局容器组件
<template>
    <div>
      <el-container>
        <el-aside width="200px">
          <el-menu :default-openeds="['1']">
            <el-submenu index="1">
              <template slot="title"><i class="el-icon-caret-right"></i>用户管理</template>
              <el-menu-item-group>
                <el-menu-item index="1-1">
                <!--插入的地方-->
                  <router-link to="/user/profile">个人信息</router-link>
                </el-menu-item>
                <el-menu-item index="1-2">
                <!--插入的地方-->
                  <router-link to="/user/list">用户列表</router-link>
                </el-menu-item>
              </el-menu-item-group>
            </el-submenu>
            <el-submenu index="2">
              <template slot="title"><i class="el-icon-caret-right"></i>内容管理</template>
              <el-menu-item-group>
                <el-menu-item index="2-1">分类管理</el-menu-item>
                <el-menu-item index="2-2">内容列表</el-menu-item>
              </el-menu-item-group>
            </el-submenu>
          </el-menu>
        </el-aside>

        <el-container>
          <el-header style="text-align: right; font-size: 12px">
            <el-dropdown>
              <i class="el-icon-setting" style="margin-right: 15px"></i>
              <el-dropdown-menu slot="dropdown">
                <el-dropdown-item>个人信息</el-dropdown-item>
                <el-dropdown-item>退出登录</el-dropdown-item>
              </el-dropdown-menu>
            </el-dropdown>
          </el-header>
          <el-main>
          <!--在这里展示视图-->
            <router-view />
          </el-main>
        </el-container>
      </el-container>
    </div>
</template>
<script>
    export default {
        name: "Main"
    }
</script>
<style scoped lang="scss">
  .el-header {
    background-color: #B3C0D1;
    color: #333;
    line-height: 60px;
  }
  .el-aside {
    color: #333;
  }
</style>

  • 添加了组件,去router修改配置文件
//导入vue
import Vue from 'vue';
import VueRouter from 'vue-router';
//导入组件
import Main from "../views/Main";
import Login from "../views/Login";
//导入子模块
import UserList from "../views/user/List";
import UserProfile from "../views/user/Profile";

//使用
Vue.use(VueRouter);
//导出
export default new VueRouter({
  routes: [
    {
      //登录页
      path: '/main',
      component: Main,
      //  写入子模块
      children: [
        {
          path: '/user/profile',
          component: UserProfile,
        }, {
          path: '/user/list',
          component: UserList,
        },
      ]
    },
    //首页
    {
      path: '/login',
      component: Login

    },
  ]
})


参数传递

第一种方式

页面设置

 <el-menu-item index="1-1">
                <!--插入的地方-->
                <!--name是组件的名字 params是传的参数 如果要传参数的话就需要用v:bind:来绑定-->
                <router-link :to="{ name:'UsePersonal',params:{id:1}}">个人信息</router-link>
              </el-menu-item>

路由设置

 {
         path:"/user/usepersonal/:id",
          name: "UsePersonal",
          component:UsePersonal
        }

页面渲染

<!-- 所有的内容都要写在div中 -->
  <div>
    <h1>用户信息</h1>
    {{$route.params.id}}
  </div>

第二种方式

页面设置(props属性设置为true)

 <el-menu-item index="1-1">
                <!--插入的地方-->
                <!--name是组件的名字 params是传的参数 如果要传参数的话就需要用v:bind:来绑定-->
                <router-link :to="{ name:'UsePersonal',params:{id:1},props:true}">个人信息</router-link>
              </el-menu-item>

路由设置props: true,

{
         path:"/user/usepersonal/:id",
          props: true,
          name: "UsePersonal",
          component:UsePersonal
        }

页面渲染 props:['id']接收值

<template>
<!-- 所有的内容都要写在div中 -->
  <div>
    <h1>用户信息</h1>
    {{id}}
  </div>
</template>

<script>
export default {
  props:['id'],
  name: "UserPersonal"
  },

重定向 redirect:"/main"

  {
      //重定向
      path:"/gohome",
      redirect:"/main"
    },

路由模式和404

路由模式有两种

  • hash:路径带#,如https://localhost/#/login
  • history:路径不带#号,如https://localhost/login
 mode:'history',
  routes:[
    {
      path:'/login',
      component:Login
    },

404页面

  1. 创建一个NotFound.vue视图
<template>
  <div>
    <h1>404,你的页面走丢了</h1>
  </div>
</template>
<script>
    export default {
        name: "NotFound"
    }
</script>
<style scoped>
</style>
  1. 配置路由
import NotFound from '../views/NotFound'
{
   path: '*',
   component: NotFound
}

路由钩子

除了之前的钩子函数还存在两个钩子函数

  • beforeRouteEnter:在进入路由前执行
  • beforeRouteLeave:在离开路由前执行

参数说明

  • to:路由将要跳转的路径信息
  • from:路径跳转前的路径信息
  • next:路由的控制参数
  • next() 跳入下一个页面
  • next(’/path’) 改变路由的跳转方向,使其跳到另一个路由
  • next(false) 返回原来的页面
  • next((vm)=>{}) 仅在 beforeRouteEnter 中可用,vm 是组件实例

在组件中

<script>
    export default {
        name: "UserProfile",
        beforeRouteEnter: (to, from, next) => {
            console.log("准备进入个人信息页");
            next();
        },
        beforeRouteLeave: (to, from, next) => {
            console.log("准备离开个人信息页");
            next();
        }
    }
</script>

在钩子函数中进行异步请求

  • 安装axios
cnpm install --save vue-axios
  • main.js引用 Axios
import axios from 'axios'
import VueAxios from 'vue-axios'
Vue.use(VueAxios, axios)
  • 准备数据
{
  "name": "cv战士",
  "url": "https://blog.csdn.net/qq_45408390?spm=1001.2101.3001.5343",
  "page": 1,
  "isNonProfit": true,
  "address": {
    "street": "含光门",
    "city": "陕西西安",
    "country": "中国"
  },
  "links": [
    {
      "name": "bilibili",
      "url": "https://bilibili.com"
    },
    {
      "name": "cv战士",
      "url": "https://blog.csdn.net/qq_45408390?spm=1001.2101.3001.5343"
    },
    {
      "name": "百度",
      "url": "https://www.baidu.com/"
    }
  ]
}

说明: 只有我们的 static 目录下的文件是可以被访问到的,所以我们就把静态文件放入该目录下

  • 在 beforeRouteEnter 中进行异步请求
<script>
    export default {
        name: "UserProfile",
        beforeRouteEnter: (to, from, next) => {
            console.log("准备进入个人信息页");
            next(vm => {
                //进入路由之前执行getData方法
                vm.getData()
            });
        },
        beforeRouteLeave: (to, from, next) => {
            console.log("准备离开个人信息页");
            next();
        },
        //axios
        methods: {
            getData: function () {
                this.axios({
                    method: 'get',
                    url: 'http://localhost:8080/static/mock/data.json'
                }).then(function (response) {
                    console.log(response)
                })
            }
        }
    }
</script>


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM