← 返回文章列表

Article / 文章

Vue

1 基础

  • 插值表达式
 {{内容}}   
  • v-text,v-html
 <span v-text="xxx"></span>     [[普通数据]]
 <span v-html="xxx"></span>     [[以html形式渲染数据]]
  • 事件v-on:xxx
 v-on:click="method"     # 点击事件
 可以简写为@click="method"
  • v-show:控制页面的标签元素是否展示,底层控制元素的display属性
 v-show="布尔值"
 v-show="变量:值必须为布尔类型"
  • v-if:也是控制元素怒的展示,底层是dom树真正的删除和添加
 v-if="布尔值"
 v-if="变量:值必须为布尔类型"
  • v-bind:给标签元素绑定相应的属性
 v-bind:标签的属性="method"        # 然后写个方法就可以控制标签的值
 可以简化为::属性名
  • v-for:遍历
 # 遍历对象 user:{name:"xxx",age:14}
 <span v-for="(index,key,value) in user">
     {{index}}:{{key}}:{{value}}     # 分别为:索引,键,和值                 </span>
 # 遍历数组 arr:{"111","222","333"}
 <span v-for="index,a in arr">
     {{index}}:{{a}}
 </span>
 # 遍历数组内的对象   users:[user1:{};user2:{}]
 <span v-for="user in users">
     {{user.name}}....
 </span>

遍历的时候注意:要绑定index,要不然vue不知道是哪个数据的index,因此需要这样写:

这样打印index的时候就不会出错了

 <span v-for="user in users" :key="user.id">
     {{index}}:{{user.name}}....
 </span>
  • v-model,能够实现双向绑定,这样就能拿到用户输入的内容
 <input type="text" v-model="message">

2 事件修饰符

 # 常用的事件修饰符有:
   .stop
   .prevent
   .capture
   .self
   .once
   passive
  • .stop

比如,两个控件,一个包裹着另一个,而两个控件都有单击事件,这样点击里面的控件,外侧的也会触发,这就叫事件冒泡

 可以在里面的控件上面的单击事件加上:@click.stop="method"
  • **.prevent **

阻止标签的默认属性,比如,一个a标签,默认就是href属性,但我不想用这个,想用自己定义的单击事件:

 <a href="xxx" @click.prevent="method"

可以堆叠起来使用:效果叠加

 <a href="xxx" @click.stop.prevent="method"
  • .self

只触发自己标签上的方法,阻止事件冒泡

 <div @click.self="method1">
    <a @click="method2"></a>
 </div>
  • .once

事件只触发一次

3 按键修饰符

用来与键盘的按键事件绑定在一起
enter
tab
delete
esc
space
...
  • enter

回车键按下后触发的事件,比如可以在输入框加入这个按键修饰符,就不会,输一个值就执行一次方法

<input @click.enter="method">

….

4 axios

引入:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  • get请求
axios.get('/user?ID=12345')
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});
  • post请求
axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .catch(function (error) {
    console.log(error);
  });

还有一堆rustful风格的请求,详情看官方文档

  • 并发请求

多个请求同时发送到后端,

 function getUserAccount() {
   return axios.get('/user/12345');
 }
 ​
 function getUserPermissions() {
   return axios.get('/user/12345/permissions');
 }
 ​
 axios.all([getUserAccount(), getUserPermissions()])
   .then(axios.spread(function (acct, perms) {
     // 两个请求现在都执行完成
   }));

5 组件(component)

组件就是将代码进行拆分复用的,一次书写多次使用

  • 全局注册
 Vue.component('login',{
     template:'html代码'
 })
 # 使用的时候,直接使用login标签即可
 <login></login>

如果注册的时候使用了驼峰的方式,则使用的时候需要将大写改为小写外加-

  • 局部注册

局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。

在这些情况下,你可以通过一个普通的 JavaScript 对象来定义组件:

 var ComponentA = { /* ... */ }
 var ComponentB = { /* ... */ }
 var ComponentC = { /* ... */ }

**然后在 **components 选项中定义你想要使用的组件:

 new Vue({
   el: '#app',
   components: {
     'component-a': ComponentA,
     'component-b': ComponentB
   }
 })
  • 第二种方式
 // 书写模板
 <template id="xxx">html代码</template>
 // 通过id选择器进行引用
 var Component={
     template: '#xxx'
 }
 // 在vue中注册
 new Vue({
   el: '#app',
   components: {
     'component-a': ComponentA,
     'component-b': ComponentB
   }
 })
  • prop的使用

给组件传递相应的数据

var Component={
    template: '#xxx'
    props:['user','password']  // 通过这个属性就能王模板传值,然后模板内部就能使用了
}
  • 动态添加

在使用组件的时候加上=v-bord=来实现控制标签的形式,这样就可以将vue实例的data里的数据传递给组件,达到动态添加数据的效果

// 书写模板
<template :name="username" id="xxx">html代码</template>
// 通过id选择器进行引用
var Component={
    template: '#xxx'
    props:['name']
}
// 在vue中注册
new Vue({
  el: '#app',
  data: {
      username: 'xxx'  
    }
  components: {
    'component-a': ComponentA,
    'component-b': ComponentB
  }
})
  • 单向数据流

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。

// 组件的使用
<Component :username="username"> </Component>
// 书写模板
<template  id="xxx">html代码</template>
// 通过id选择器进行引用
var Component={
    template: '#xxx',
    data(){    // 子组件也可以有自己的数据,还可以获取到父元素的数据,并保留下来
        return{
            name: this.username
        };
    },  
    methods{    // 组件中也可以有自己的方法
        method(){xxxx};
    },
    props:['username']
}
// 在vue中注册
new Vue({
  el: '#app',
  data: {
      username: 'xxx'  
    }
  components: {
    'component': Component
  }
})
  • 向子组件中传递方法
// 组件的使用
<Component :username="username" @a='findAll'> </Component>
// 书写模板
<template  id="xxx">html代码</template>
// 通过id选择器进行引用
var Component={
    template: '#xxx',
    data(){    // 子组件也可以有自己的数据,还可以获取到父元素的数据,并保留下来
        return{
            name: this.username
        };
    },  
    methods{    // 组件中也可以有自己的方法
        method(){xxxx};
        find(){    // 调用父组件的方法
           this.$emit('a');   
        }
    },
    props:['username']
}
// 在vue中注册
new Vue({
  el: '#app',
  data: {
      username: 'xxx'  
  },
  methods{      // 父组件的方法
    findAll(){xxx};
  },
  components: {
    'component': Component
  }
})

6 路由

基本

就像字面意思那样,用于管理页面的组件,我们可以通过路由对页面的子组件进行控制

vue-router,是另外一个部分,需要另外引入,且引入的时候要放在vue的引入之后

<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  • 切换展示 当浏览器路径切换输入的时候就会切换到不同的页面
<body>
    <div id="app">
        <!--显示路由组件-->
        <router-view></router-view>
    </div>
</body>
<script>
    // 声明组件
    const login ={
        template: '<h1>登录</h1>'
    };
    const register = {
        template: '<h1>注册</h1>'
    };

    // vue-router 对象
    const router = new VueRouter({
        routes: [     //
            {path:'/login',component:login},
            {path:'/register',component:register}
        ]
    });

    // vue对象
    const app= new Vue({
        el: '#app',
        data: {
            username: "xxx",
        },
        methods:{

        },
        router:router // 在vue对象中注册路由对象
    });
</script>

还可以加上两个a标签,点击按钮切换地址栏,注意路径前面的有个#号

<a href="#/login"></a>
<a href="#/register"></a>
  • router-link标签

使用router-link标签的时候,路径就不需要设置#了

<router-link to="/login">点我登录</router-link>
<router-link to="/register">点我注册</router-link>

tag属性可以设置router-link标签渲染的样式

 <router-link to="/login" tag="button">点我登录</router-link>
  • 默认规则

可以选择默认选择哪个组件,比如刚进页面就是登录页,然后点击注册就是注册页,在vue-router中设置当路径是根路径的时候就=重定向=到登录页面

 const router = new VueRouter({
     routes: [     //
         {path: '/',redirect: login},
         {path:'/login',component:login},
         {path:'/register',component:register}
     ]
 });

参数传递

  • 使用类似get的方式

可以看到在地址栏输入参数后,就可以在组件中获取到

 <div id="app">
         <router-link to="/login?id=1">登录</router-link>
         <router-link to="/register">注册</router-link>
         <!--显示路由组件-->
         <router-view></router-view>
     </div>
 <script>
     // 声明组件
     const login ={
         template: '<h1>登录</h1>',
         data(){return{}},
         methods: {},
         created(){
             console.log("id="+this.$route.query.id);
         }
     };
 </script>
  • restful形式

也就是把参数放到路径中传递,这样参数就会放在params中,同样获取即可

<script>
    // 声明组件
    const login ={
        template: '<h1>登录</h1>',
        data(){return{}},
        methods: {},
        created(){
            console.log("id="+this.$route.params.id);
        }
    };
</script>

嵌套路由

也就是路由中含有子路由的形式,在vue-router中注册组件的时候加入children属性,设置子组件的参数

     <div id="app">
         <router-link to="/product">商品管理</router-link>
         <router-view></router-view>
     </div>
     <template id="product">
         <div>
             <h1>商品管理</h1>
             <router-link to="/product/add">商品添加</router-link>
             <router-link to="/product/ddd">商品删除</router-link>
             <router-view></router-view>
         </div>
     </template>
 <script>
     // 商品模板
     const product={
         template: '#porduct'
     };
 ​
     // 商品添加模板
     const add={
         template: '<h2>商品添加</h2>'
     }
     // 商品修改模板
     const ddd={
         template: '<h2>商品删除</h2>'
     }
     // vue-router 对象
     const router = new VueRouter({
         routes: [
             {
                 path:'/product',
                 component:product,
                 children:[     // 使用children属性来指定当前模板的子模板
                     {path:'add', component:add},
                     {path:'ddd', component:ddd},
                 ]
             },
         ]
     });

二 Vue Cli 脚手架

前面的路由我们看到,所有的页面都写在一个html页面,这显然是非常混乱的,这就需要我们用到脚手架这个东西

优点:

  • 快速引入外部依赖:类似java的Maven,管理页面所需要的资源,很便捷的引入
  • 快速搭建vue项目
  • 可一键升级外部依赖:一条命令
  • wabpack的打包工具:快速打包
  • 插件拓展:快捷的使用基于vue的Ui,比如 element
  • 图形化的创建管理工具

安装

 npm install -g vue-cli   [[老版本的vue-cli]]
 npm install -g @vue-cli   # 新版本的

创建vue CLI项目

 vue init webpack 项目名  # 老版本
 vue create xxx # 新版本

运行项目

 npm run dev 

项目目录结构

我们主要关注src下面的即可

  • components:编写我们的组件
  • router:在这里配置我们的路由
  • App.vue:用于展示主页

使用axios

下载

 npm install axios --save-dev

项目中引入

并替换默认的$http的异步请求,换为axios

 import axios from 'axios'
 ​
 Vue.prototype.$http=axios  

vue项目部署

  • 在项目的根目录下执行如下的命令进行打包
 npm run build

打包后项目就会多出一个dest目录,里面就是我们项目打包后的内容

然后放到springBoot项目的static中即可

查看全部文章 →