美文网首页
vue-05-Vue-cli和移动端布局和动画

vue-05-Vue-cli和移动端布局和动画

作者: 未来在奋斗 | 来源:发表于2019-12-15 11:16 被阅读0次

    vue-cli(重点)

    vue-cli 是用来管理 vue 项目的工具,可以使用 vue-cli 快速创建项目、启动项目、编译项目等操作。

    常说的vue全家桶指:vue-cli、vue-router、vuex、vue-resource。

    vue的单文件组件扩展名是.vue文件,需要借助vue-loader,才能被正常解析。

    vue-cli 3 (新版本)

    如果之前安装过低版本的 vue-cli ,那么命令行执行:

    npm uninstall vue-cli -g
    

    然后安装

    npm install -g @vue/cli
    

    然后检查版本

    vue --version
    

    创建项目

    vue create myapp
    

    命令之后后会让我们选择预设:选默认的default即可,Manually指手动自定义,然后选择npm管理包。

    项目创建后,cd进入到项目后,runserve运行项目,这样在浏览器中就可以看到效果了。

    cd myapp
    npm run serve
    

    然后在 src 目录下正常的开发项目就可以了,src/main.js 是入口页面。

    // 设置为 false 以阻止 vue 在启动时生成生产提示。
    Vue.config.productionTip = false
    

    项目开发完毕之后,需要打包

    npm run build
    

    dist目录下的文件,就是生产环境下的文件。

    vue-cli 2 (旧版本)

    # 旧版本:基于 webpack 创建 vue 项目
    npm install vue-cli -g
    vue init webpack-simple appname  
    cd appname
    npm install
    npm run dev
    
    npm run build
    

    项目结构及文件介绍

    public/index.html 是浏览器访问的入口页面。

    src 目录下保存的是开发环境中的碎片化文件。

    package.json

    在 package.json 中有 eslintConfig 属性,修改 rules 规则,允许项目中使用 console。

    "rules": {
        "no-console":"off"
    }
    

    vue.config.js 的配置

    是 vue 项目中的配置页面,需要自己在项目的根目录创建。

    myapp/
        node_modules/
        public/
        src/
        vue.config.js
    

    proxy 代理

    前端跨域访问别人服务器中的某个文件时,因同源策略的问题,我们的前端拿不到别人的数据,这时我们可以使用代理的方案来解决此问题。

    在 vue 中,通常使用 axios 来发起请求,获取响应。

    使用 axios

    npm install axios -S
    

    每当使用 npm install 下载依赖模块时,最好加上参数 -S 或 -D

    -S 表示最终 build 打包时,将 axios 的源码也合并到一起。

    {
        dependencies:{},        # --save        生产环境    简写 -S
        devDependencies:{}      # --save-dev    开发环境    简写 -D
    }
    

    在项目根目录,自己创建 vue.config.js 文件,里面写入:

    module.exports = {
        devServer: {
            proxy:{
                "/api": {
                    target: "http://www.wyyijiaqin.com",
                    pathRewrite: { '^/api': '' },
                    changeOrigin: true,
                }
            } 
        }
    }
    

    那么 vue 中访问 /api 时,实际就是跨域访问 http://www.wyyijiaqin.com

    import axios from "axios";
    export default {
        methods:{
            fn(){
                // 直接访问时,因同源策略,拒绝访问,报错
                axios.get('http://www.wyyijiaqin.com/').then(res=>{
                    console.log(res.data)
                })
            },
            async fn2(){
                // 代理访问,能够拿到数据
                var {data} = await axios.get('/api');
                console.log( data )
            }
        }
    };
    

    alias 别名

    vue.config.js

    const path = require("path");
    function resolve (dir) {
        return path.join(__dirname, dir)
    }
    
    module.exports = {
        chainWebpack: config=>{
            config.resolve.alias
                .set('@$', resolve('src'))
                .set('assets', resolve('src/assets'))
                .set('$comp', resolve('src/components'))
        }
    }
    

    使用别名

    import HelloWorld from "$comp/HelloWorld.vue";
    

    修改 vue.config.js 后要重新 npm run serve

    sass 环境

    npm install sass-loader node-sass --save-dev
    

    然后在vue文件中:

    <style scoped lang="scss">
    $bg : yellow;
    body{
        div{
            background: $bg;
        }
    }
    </style>
    

    当然在 js 文件中也可以使用 import 引入 scss 文件

    移动端布局

    rem 单位

    import 'js/rem.js';
    

    引入 rem.js 文件后,css 中就可以直接写 rem 单位了,改变移动端设备时,宽高会等比例更新。

    比如 UI 给的设计稿宽度是 750px 的,其中某个图片宽为 375px,如果用户的手机宽度就是750,那么看到的图片就是375。但是如果用户的手机是 1500 时,图片就应该显示 750,需要进行等比缩放。

    如果 UI 给的设计稿宽度是 750px,那么我们应该在 rem.js 中执行的函数的参数设置为 750 ,这样设计稿中的 100px,就等于 1rem 了。

    flexbox 布局

    弹性盒布局默认是横向分配空间,如果想纵向分配,需设置 flex-direction: column;

    div{
        display: flex;
        justify-content: space-around;
        align-items: center;
    
        li{
            text-align:center;
    
            a{
                color:white;
                text-decoration: none;
            }
    
            .router-link-exact-active{
                color: green !important;
            }
        }
    }
    

    font-awesome 字体图标

    import './assets/font-awesome-4.7.0/css/font-awesome.min.css';
    
    <font class="fa fa-home"></font>
    

    动画

    transition 过渡

    Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。

    transition 是 vue 提供的组件,这个组件的作用是给其子节点添加动画效果。

    <style>
        @import url(https://cdn.bootcss.com/animate.css/3.7.0/animate.min.css);
        
        .toast{ 
            transform: translate(-50%,-50%); 
            position: fixed; 
            left: 50%;
            top: 50%; 
            background:black;
            color:white;
        }
    </style>
    <div id="app">
        <button @click="fn">动画按钮</button>
        <transition
            enter-class=""
            enter-active-class="animated fadeIn"
            enter-to-class=""
            leave-class=""
            leave-active-class="animated fadeOut"
            leave-to-class=""
        >
            <div class="toast" v-if="isShow">Toast</div>
        </transition>
    </div>
    <script>        
        var app = new Vue({
            el: '#app',           
            data:{
                isShow:true,                
            },
            methods:{
                fn(){
                    this.isShow = !this.isShow;
                }
            }
        })
    </script>
    

    解读:当toast对应的div被创建到页面上时,transition会给这个div添加enter相关的css样式,当toast这个div从页面上被删除掉的时候,transition会给这个div添加leave相关的css样式,所以transition组件就是做动画设置的组件。

    v-if 和 v-show 都可以实现动画。

    :duration="10000" 可设置动画时长,单位毫秒。

    enter-class 在第一帧之后就删除了;

    enter-to-class 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。

    transition-group

    transition只能有0个或1个子节点,而transition-group可以有零个或多个子节点。

    循环渲染时,必须写key,并且key的值是唯一标识符(不要用数组下标)。

    <div id="app">
        <input type="text" v-model="str" />
        <button @click="fn2">添加</button>
        <transition-group
            enter-class=""
            enter-active-class="animated fadeIn"
            enter-to-class=""
    
            leave-class=""
            leave-active-class="animated fadeOut"
            leave-to-class=""
        >
            <li v-for="(item) in arr" :key="item.id">
                {{item.val}}
                <input type="button" @click="fn3(item.id)" value="del" />
            </li>
        </transition-group>
    </div>
    <script>        
        var app = new Vue({
            el: '#app',           
            data:{
                str : "",
                arr : []               
            },
            methods:{
                fn2(){
                    this.arr.push({"val":this.str, "id":new Date().getTime()});
                },
                fn3( id ){
                    var ind = this.arr.findIndex(obj=>obj.id===id);
                    this.arr.splice(ind, 1)
                }
            }
        })
    </script>
    

    钩子函数

    动画回调函数(钩子函数),动画执行的过程中,自动触发的一些函数。

    既可以写在 transition 中,也可以写在 transition-group 中。

    <transition
        v-on:before-enter="beforeEnter"
        v-on:enter="enter"
        v-on:after-enter="afterEnter"
        v-on:enter-cancelled="enterCancelled"
        
        v-on:before-leave="beforeLeave"
        v-on:leave="leave"
        v-on:after-leave="afterLeave"
        v-on:leave-cancelled="leaveCancelled"
    >
    

    钩子函数分两组:

    • enter 为创建节点前自动执行、创建节点过程中自动执行、创建节点完毕时自动执行、创建节点取消时自动执行。
    • leave 为删除节点前自动执行、删除节点过程中自动执行、删除节点完毕时自动执行、删除节点取消时自动执行。
    methods: {
        beforeEnter: function (el) {
            console.log('进入前', el)
        },
        enter: function (el, done) {
            console.log('进入...', el)
            setTimeout(()=>{ // 要给动画效果预留时长,如果瞬间done(),那么看不到动画效果。
                done() // 表示完成动画
            }, 2000)
        },
        afterEnter: function(el){
            console.log('进入完成', el)
        },
        enterCancelled: function(el){
            console.log('取消进入', el)
        }
    }    
    

    相关文章

      网友评论

          本文标题:vue-05-Vue-cli和移动端布局和动画

          本文链接:https://www.haomeiwen.com/subject/vrirnctx.html