zoukankan      html  css  js  c++  java
  • vue-day06----过渡&动画(transition)、axios、axios以post方式请求数据、axios常用的配置项、axios拦截器、qs处理数据、vue中async和await的使用

    ### vue过渡&动画    transition标签

        1、在vue中如果需要使用动画的时候必须要给动画的元素/组件包裹一个transition内置组件
        2、transition内置组件身上有一个name属性,值为动画的名称
        3、vue中应用动画的元素必须经历显示和隐藏的操作(v-if v-show)
        4、vue为动画提供了6个类名:
    复制代码
            .[name]-enter
            .[name]-enter-active    一般用来设置动画类型和动画时间
            .[name]-enter-to
    
            .[name]-leave
            .[name]-leave-active    一般用来设置动画类型和动画时间
            .[name]-leave-to
    复制代码
        注意:
            1、动画执行完后动画提供的类名会消失,所以当前元素bottom设置为最终要显示的样式。
            2、当多个元素进行动画的时候要将transition组件改为transition-group组件,另外切记子元素必须要加上key值。
            3、.[name]-enter-to和.[name]-leave一般是默认时的样式,不写也行。
     
        步骤:
        (1)模仿mint-ui的active sheet
            ①用transition标签将需要动画的 .left 盒子包裹,设置name属性
                <transition name="leftBox">
                    <div class="left" v-show="state"></div>
                </transition>
            ②设置 .left 样式和leftBox的动画效果
    复制代码
                /* 动画元素的初始布局就是正常的元素显示时布局 */
                .left{
                    position: absolute;
                    left: 0;
                    top: 0;
                     100px;
                    height: 100%;
                    blue;
                }
                .leftBox-enter,.leftBox-leave-to{
                    left:-100px;
                }
                .leftBox-enter-active,.leftBox-leave-active{
                    transition: left .3s ease-out;
                }
    复制代码
            此时,点击按钮时会进行动画的滑入滑出。
     
        (2)帧动画
            ①设置name属性
                <transition name="move">
                    <div class="box" v-show="state"></div>
                </transition>
            ②帧动画函数
    复制代码
                @keyframes move {
                    0%{
                        transform: translate(0,0);
                    }
                    25%{
                        transform: translate(200px,0);
                    }
                    50%{
                        transform: translate(200px,200px);
                    }
                    75%{
                        transform: translate(0,200px);
                    }
                    100%{
                        transform: translate(0,0);
                    }
                }
                .move-enter-active{
                    animation: move 3s;
                }
    复制代码
            (3)配置animate.css使用:
                ①引入animate.css:
                    第一种方式:在所需要的组件中引入:@import "../src/assets/animate.min.css";
                    第二种方式:在main.js中引入:import "../src/assets/animate.min.css";
                    第三种方式:在index.html中引入:<link rel="stylesheet" href="../src/assets/animate.min.css">
                ②给transition标签添加enter-active-class和leave-active-class类名,其中animated是必须要写的属性值,后面跟需要使用的动画名
                    <transition enter-active-class="animated lightSpeedIn" leave-active-class="animated lightSpeedOut">
                        <div class="box" v-show="state"></div>
                    </transition>

    ### axios

        概念:axios是前后端交互的一个插件,是基于promise的http库。
     
        好处:
            从浏览器中创建XMLHTTPRequest
            从node.js中创建http请求
            支持PromiseAPI
            拦截请求和响应
            取消请求
            自动转换JSON数据
            客户端支持防御 XSRF
     
        如何使用:
            ①安装:npm install axios -S
            ②使用:
                get简写:
                    axios.get("url",{
                        params:{id:123},
                        headers:{}
                    }).then().catch();
                post简写:
                    axios.post("url",{
                        id:123,
                        name:"aaa"
                    }).then().catch();
                综合写法:
    复制代码
                    axios({
                        method:请求方式,
                        url:请求地址,
                        data:post请求时需要传递的数据(只有post请求时才有此参数),
                        params:get请求时需要传递的数据(只有get请求时才有此参数),
                        headers:{}
                    });
    复制代码
        axios可以执行多个并发请求(Promise可以解决回调地狱问题,可以执行并发请求):
    复制代码
            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){
                // 两个请求现在都执行完成
            }));
    复制代码
            ----all()表示并行
        步骤:(axios请求 http://m.maoyan.com&cityId=10 )
            ①下载插件:npm install axios -S
            ②在需要axios请求的组件中引入插件:import axios from 'axios';
            ③created中做请求操作:
    复制代码
                let url="http://m.maoyan.com/ajax/cinemaList";
                axios.get(url,{params:{
                    cityId:10
                }}).then((data)=>{
                    console.log(data);
                });
    复制代码
            ④处理跨域(DevServer中设置proxy属性):
    复制代码
                devServer: {
                    port: 9000,
                    proxy: {
                        "/maoyan": {
                            target: "http://m.maoyan.com",// 目标服务器路径
                            changeOrigin: true,
                            pathRewrite: {
                                "^/maoyan": ""
                            }
                        }
                    }
                }
    复制代码
                重启后,用 /maoyan 替换url中的 http://m.maoyan.com。
            ⑤因为axios在项目中会经常用到,所以尽量在main.js中做全局的引入,这样就不用在组件中再进行单独的引用:
                import axios from "axios";
                Vue.prototype.$axios=axios;
                此后,axios.get().then();可以替换为this.$axios.get().then();
     

    ### axios以post方式请求数据

        express创建服务:
            ①新建expressExample文件夹,cmd下初始化:(npm init -y),下载express、body-parser插件(npm i express body-parser -S)
            ②expressExample下新建index.js文件和router/user.js文件:
                index.js:
    复制代码
                    const express = require("express");
                    const bodyParser = require('body-parser');
                    const app = express();
                    const userRouter = require("./router/user");
                    app.use(bodyParser.urlencoded({ extended: false }));
                    app.use(bodyParser.json());
                    app.use("/user",userRouter);
                    app.listen(6666);
    复制代码
                user.js:
    复制代码
                    const express = require("express");
                    const router = express.Router();
                    router.post("/login",(req,res)=>{
                        const {username,password} = req.body;
                        console.log(username,password);
                        res.json({
                            code:200,
                            data:{
                                msg:"post方式请求得到的消息"
                            }
                        });
                    });
                    router.get("/register",(req,res)=>{
                        const {username,password}=req.query;
                        console.log(username,password)
                        res.json({
                            code:200,
                            data:{
                                msg:"get方式请求得到的消息"
                            }
                        });
                    });
                    module.exports = router;
    复制代码
            ③package.json中scripts中添加:
              "dev":"supervisor index"
            ④启动服务:终端中npm run dev
            ⑤dev.config.js中给proxy对象添加 "user" 代理(192.168.43.185是本机用的ip地址【终端中用ipconfig打开,拿到IPv4】,端口号和index.js中一样):
                "/user":{
                    target:"http://192.168.43.185:6666",
                    changeOrigin: true
                }
            ⑥重启项目服务:npm run dev
            ⑦任意组件中通过post方式请求数据:
    复制代码
                let url="/user/login";
                axios.post(url,{
                    username:"wql",
                    password:"123456"
                }).then((data)=>{
                    console.log(data)
                });
    复制代码

    ### axios常用的配置项

        baseUrl:判断是开发环境还是生产环境:
            baseURL: process.env.NODE_ENV == 'development'?'https://some-domain.com/api/':"....."
        method
        url
        data
        params
        headers----token
        timeout----设置请求的最长时间,一般设置成5秒
        baseUrl
        withCredentials----跨域请求时是否需要凭证,默认为false,设置为true时可以将cookie带过去
        重新配置axios的配置项的两种方法:
            ①创建一个新的axios,重新配置配置项
                axios.create({
                    timeout:5000,
                    withCredentials:true
                });
            ②通过axios.default:
                axios.default.baseUrl="";
     

    ### axios拦截器

        数据在发送到服务端之前以及数据响应到客户端之前的一个拦截。
     
        请求拦截:loading   处理token
     
        响应拦截:数据处理  axios默认会返回一堆数据,一堆数据中做筛选然后只返回data中的数据,实际可以根据需要做不同的处理。
     
        步骤:
            ①安装插件:npm install axios qs -S
            ②utils下新建http.js:
    复制代码
                import axios from "axios";
                import qs from "qs";
                const server=axios.create({
                    timeout:5000,
                    withCredentials:true
                });
                server.defaults.headers["content-type"]="application/json";// 默认请求的是json格式的,如果是get请求这句写不写都行,如果是post请求,不要写这句。如果是x-www格式的,需要设置请求头的content-type
                // server.defaults.headers["content-type"]="application/x-www-from-urlencoded";
                // 请求拦截
                server.interceptors.request.use((config)=>{
                    console.log(config,"utils")
                    config.headers["authToken"]="xxxxx";// 请求头中添加token值
                    config.data=qs.stringify(config.data);// 用qs将data数据转成查询字符串(key=value&key=value)
                    return config;
                });
                // 响应拦截
                server.interceptors.response.use((config)=>{
                    console.log(config,"utils----response")
                    switch(config.status){
                        case 200:
                            return config.data;
                        default:
                            break;
                    }
                });
                export default server;
    复制代码
            ③引入:
                将 import axios from "axios"; 改为 import axios from "./utils/http.js";

    ### qs处理数据

        将数据转换成查询字符串 key=value&key=value
        安装:npm install qs
        使用:
            import qs from "qs";
            qs.stringify();

    ### vue中async和await的使用

        如果是脚手架可以直接使用async和await,自己配置的webpack中需要借助两个插件:
            @babel/plugin-transform-runtime
            @babel/runtime
     
        步骤:
            ①安装插件:
                npm i @babel/plugin-transform-runtime --save-dev 
                npm i @babel/runtime --save
            ②在目录的.babelrc中添加如下配置:
                "plugins":["@babel/plugin-transform-runtime"]
            ③添加async和await:
                created() {
                    let url="/maoyan/ajax/cinemaList";
                    axios.get(url,{params:{
                        cityId:10
                    }}).then((data)=>{
                        console.log(data)
                    });
                }
                改为:
    复制代码
                async created() {
                    let url="/maoyan/ajax/cinemaList";
                    let data=await axios.get(url,{params:{
                        cityId:10
                    }});
                    console.log(data)
                }
    复制代码

    ### 路由

        前端路由:
            根据用户请求不同的url来展示不同的页面或者数据,前端路由是不会涉及到后端请求的,以及页面不会进行刷新。用户体验比较好,一般用来做单页面开发(SPA)。前端路由底层原理:hashchange和H5的history API中的popState和replaceState来实现。
        后端路由:
            根据用户请求的路径来返回不同的数据或页面,后端路由一般情况下都是用来做接口的,通过ajax请求的路径来返回对应的数据。
        使用流程:
            ①安装路由:npm install vue-router -S
            ②创建router/index.js文件(将vue和vue-router引入,组件引入,创建路由实例,将路由表routes【数组】和每个页面配置好):
                import Vue from "vue";
                import VueRouter from "vue-router";
                import Movie from "../pages/movie";
                import Cinema from "../pages/cinema";
                import Mine from "../pages/mine";
                Vue.use(VueRouter);
                let router=new VueRouter({
                    mode:"hash",
                    routes:[
                        {
                            path:"/movie",
                            component:Movie
                        },
                        {
                            path:"/cinema",
                            component:Cinema
                        },
                        {
                            path:"/mine",
                            component:Mine
                        }
                    ]
                });
                export default router;
            ③main.js中将抛出的router引入,并挂载到vue实例中:
                import router from "./router";
                new Vue({
                    router,
                    render:h=>h(App)
                }).$mount("#app");
            ④路由显示:在根组件App.vue中用<router-view></router-view>开辟一块空间用来显示不同的组件。此时在地址栏地址后面输入地址可以进入到对应的页面
            ⑤路由跳转:新建components/tabBar/index.vue,用<router-link></router-link> to属性将路径赋予到每个按钮
                <router-link v-for="(item,index) in tabs" :key="index" :to="item.path">
                    <i class="iconfont" v-html="item.icon"></i>
                    <span>{{item.text}}</span>
                </router-link>
            

    ### 路由常用的配置项

        mode----路由的形式,默认是hash,另一种是history
        routes----路由表(数组)
            path----匹配路由的路径
            components----路由匹配成功后显示对应的组件



    ### vue路由的内置组件

        当我们将VueRouter挂载到vm实例身上时会多出2个内置组件
        router-view----渲染路由匹配的组件
        router-link----路由的跳转(底层原理是a标签,它属于内置组件自身会有一个to属性,这个属性是跳转的地址)

    ### vue中路由跳转的方式有哪些

        1、<a></a>
        2、router-link
        3、编程式导航
  • 相关阅读:
    leetcode701. Insert into a Binary Search Tree
    leetcode 958. Check Completeness of a Binary Tree 判断是否是完全二叉树 、222. Count Complete Tree Nodes
    leetcode 110. Balanced Binary Tree
    leetcode 104. Maximum Depth of Binary Tree 111. Minimum Depth of Binary Tree
    二叉树
    leetcode 124. Binary Tree Maximum Path Sum 、543. Diameter of Binary Tree(直径)
    5. Longest Palindromic Substring
    128. Longest Consecutive Sequence
    Mac OS下Android Studio的Java not found问题,androidfound
    安卓 AsyncHttpClient
  • 原文地址:https://www.cnblogs.com/GGbondLearn/p/12441407.html
Copyright © 2011-2022 走看看