美文网首页Vue.js专区我爱编程Vue
vue安装入门以及常见问题总结(从安装到路由,持续更新中)

vue安装入门以及常见问题总结(从安装到路由,持续更新中)

作者: 小水果_kj | 来源:发表于2018-03-30 15:22 被阅读172次

    入门vue,以及常见的知识点总结

    1 安装(安装环境需要在node环境下,如果没有安装node.js请到官网安装)

    1)直接打开cmd(此时不需要进入项目)

    2)npm -v(查看版本,需要3.0版本才可以,如果低于3.0可以在安装淘宝镜像之后执行cnpm install npm -g升级版本即可)

    3)npm install -g cnpm --registry=https://registry.npm.taobao.org(安装淘宝镜像速度更快 )

    4)cnpm install vue(安装vue,如果安装vue-cli脚手架的话可忽略此步,因为vue-cli会帮我们安装好)

    5)cnpm install --global vue-cli(初学者建议安装vue-cli脚手架,只需几分钟即可创建并启动一个带热重载、保存时静态检查以及可用于生产环境的构建配置的项目)

    6)vue init webpack my-project (yes)(初始化并创建项目my-project,一直按yes即可;此时你在什么路径下创建的项目也在此目录下)

    7) cd my-project(进入项目)

        npm install (生成node-modules依赖)

        npm run dev(开发模式下运行,默认端口号8080打开)

        npm run build(生产环境打包,需要把config/index.js文件夹下的build的改为assetsPublicPath: './',才能打包,不然会空白,打包之后的文件dist以放在ngnix的html低下,然后修改配置文件 ngnix.conf的localhost,端口号,还有

              location / {

                  root  html/dist;

                  index  index.html index.html;

              }

            )就可以代理查看项目啦

    安装以上命令时可能会有报错的情况,这个时候可以看一下报错内容,一般是缺少某个内容或者是版本不对导致的,按照报错内容进行改正即可(ESLint的作用是检查代码错误和统一代码风格的 ,为了规范,建议安装使用)

    2 项目目录

    安装完毕后项目中默认产生了一些文件夹,代表的意思:

    build : 里面是一些配置文件,webpack.dev.config.js(开发模式下使用),webpack.prod.config..js(生产模式使用),webpack.base.config.js(基本配置文件)这些可以点进去看一看基本内容了解一下

    index.html :项目总入口html文件

    src : 开发模式下我们写代码的地方,这里我的代码结构为

    线下开发目录

    1)assets放一些css,js,img,fonts文件;components放组件;router、index.js是对路由的配置;

    2)main.js : 项目js入口文件,引入vue以及总组件,实例化组件

          new Vue({

                el: '#app', //挂载的元素对应index,html页面的id

                components: {App},//注册组件

                template: '<App/>'//加载的模板,将el标识的元素替换成<App></App>,APP是此实例注册的App组件

          })

    3)App.vue: 总的组件入口

          所有的组件都在这里,包括三部分

        <template></template> <script></script>  <style></style>

        其中template是模板,将代替#app这个元素的内容,注意里面必须有一个最外层的div或者其他标签包裹不然会报错,此时我的最外层用app1包裹,例如

    模板

            script标签里面,以es6语法,写引入的组件,例如

            import : 引入你所需要的东西

            export default : 导出你需要调用的内容

            components : 引入的子组件,然后在html中使用如<Header></Header>

            import './assets/lib/common.css'

            import Header from './components/Header.vue'

            import Footer from './components/Footer.vue'

            export  default {

                name: 'App',

                components: {

                    Header,

                    Footer

              }

            }

    当然以上export default{}中也可以加入其他字段如methods,data等

    3 基础知识点

    接下来是一些基础知识点总结:

    1)data字段必须是一个函数 es6写法为 data (){return {}} 原因 :

    因为组件可能被用来创建多个实例。如果 data仍然是一个纯粹的对象,则所有的实例将共享引用同一个数据对象,如果是 data 函数,每次创建一个新实例后,我们能够调用 data 函数,从而返回初始数据的一个全新副本数据对象。

    2)var const let 什么时候用(es6)?

    const一般用来定义常量,let变量(无法重复声明覆盖),var(能重复声明变量),所以一般不变的内容用const,变量用let,var少用

    3)computed methods 的联系和区别

    computed计算属性会依赖缓存,只有相关依赖发生改变时候才会重新求值,也就是说data属性中的相关内容没有发生改变的话,访问computed将不会执行此函数,methods则会重新渲染,调用该函数

    综上所述,当有一个性能开销比较大,需要大量的计算或者遍历一个极大的数组时候可以用computed,缓存也有自己的缺点:

    意味着下面的计算属性不会再更新,因为Date.now()不是响应式依赖:

        computed: {

            data: function () {

                return Date.now()

            }

        }

    总之:数据量大,需要缓存用computed,每次需要重新加载不需要缓存时候,用methods

    4)生命周期主要内容

    主要包括8个状态

    beforeCreate : $data数据与$el结点都是undefined不可用

    created:$data可用,但是DOM没生成,所以$el为undefined

    beforeMount:即将挂载,$el不再是undefined成功关联到指定的dom结点,但是此时还没有成功渲染data中的数据

    mounted :挂载完毕,数据已经成功渲染

    beforeUpdate:当我们修改data时候,vue会自动帮我们更新渲染视图,在这个过程中,vue提供了beforeUpdate钩子,检测到我们要修改数据的时候,更新渲染视图之前会触发钩子beforeUpdate,此阶段视图并未渲染更新

    updated:视图已经更新

    beforeDestroy:调用实例的destroy()方法可以销毁当前组件,在销毁前,会触发这个钩子

    destroyed:此时实例和其他实例的关联已经被清楚,他与视图之间也被解绑

    5) 一些常见指令总结

    v-bind:xx=""简写为:xx=""

    v-on:click=""简写为@click

    v-if(dom结点是否存在),v-show(display)

    v-for="todo in todos"(注意key的使用,key是必须的v-bind:key,当v-for与v-if同时使用v-for权重更大)

    v-once执行一次的插值

    v-html=""解释为html代码

    6)父组件传递数据给子组件 props的使用

    当props:[]里面的内容使用驼峰命名(不支持短线分割式命名)的时候,父组件使用它时应该改成短线分割式命名,props是单向绑定,父组件属性变化会传导给子组件,反过来不会,案例如下

    父组件 父组件数据 子组件内容

    7)子组件使用$emit触发父组件自定义事件,案例如下

    父组件数据和方法 父组件 子组件

    7)路由router(建议参考https://www.cnblogs.com/nangxi/archive/2017/08/11/7345109.html)

    配置路由文件 router/index.js

    路由使用  import Vue from 'vue'

                    import Router from ‘vue-router’(安装vue-router之后引用进来)

                    Vue.use(Router)

    router-link router-view使用

    8)模拟json数据,用v-resource获取(官网已经不维护v-resource,建议使用axios)

    对build/webpack.dev.conf.js文件进行配置

    //增加express,利用express书写接口,前端去调用接口

    const express = require('express')

    const app = express()

    //加载本地数据文件

    var appData = require('../src/assets/js/genus_percentage.js')//获取json对象

    var goods = appData.percent_yhj //获取字段名

    var apiRoutes = express.Router()

    //为了统一管理API接口,一般要在请求的路由前面加上'/api',来表明这个路径是专门来提供api的

    app.use('/api',apiRoutes)

    接下来就可以通过vue-resource引入模拟的json数据(vue文件)

    <ul>

        <li v-for="items in goods">我的百分数为{{items.percent}}</li>

    </ul>

    mounted () {

        this.getData()

    },

    methods: {

        getData: function () {

            let _this = this

            this.$http.get('/api/good',{}).then(response => {

                _this.goods =repsonse.body.data

            }, response => {

                console.log(response)

            })

        }

    }

    9)axios的使用以及注意事项

    基本使用:

    安装axios,然后import axios from 'axios'

    Vue.proptotype.$ajax =axios//其他组件可以通过this.$ajax直接使用,修改了vue对象的原型属性

    为了兼容ie9+以上的建议安装使用es6-promise

    import Es6Promise from 'es6-promise'

    Es6Promise.polyfill()

    然后组件中这样写

    mounted () {

        this.$ajax({

        methods: 'get',

        url: '/api/goods',//请求的本地地址,

            data: {

        }

        }).then(response => {

            let _data =response.body.data

        }).catch(function (err) {})

    }

    注意事项:

    axios不支持Vue.use(axios),应该使用Vue.prototype.$axios =axios,在其他组件可以用this.axios调用使用

    10)什么是跨域?解决跨域问题

    浏览器具有同源策略,同源指的是域名,协议和端口如果不相同就要跨域了

    跨域的方法有:

    10.1)jsonp动态添加script标签来调用服务器提供的js脚本,支持get不支持post

    script标签的src属性是可以跨域的,传递一个callback参数给跨域服务端,但是怎么让远程js知道他调用的本地函数叫什么名字呢?办法如下

    跨域服务器 提供的js脚本动态生成,这样调用者可以传一个参数过去告诉跨域服务器“”“我想要一段调用xxx函数的js代码,请你返给我”,于是跨域服务器就可以按照客户端的需求来生成js脚本并相应啦

    10.2)vue 开发环境下跨域,配置config/index.js里面的proxyTable:{},

    dev: {

    加入以下

    proxyTable:{

    '/api': {

        target:'http://10.00.100.100:8002/',//设置你调用的接口域名和端口号,别忘记加http

        changeOrigin: true,//为true的话,请求的header将会设置为匹配目标服务器的规则(Access-Control-Allow-Origin

        pathRewrite:{

            '^/api':'/'  //用‘/api’代替target的地址,后面组件调用接口时可以直接用api代替,比如我要调用http://10.00.100.100:8002/user,可以直接写'/api/user'即可

        }

    }

    }

    }

    10.3)生产环境下解决跨域问题:

    10.3.1)后端配置服务器cors,在响应头添加Access-Control-Allow-Origin

    10.3.2)用jsonp,axios不支持jsonp所以要下载jsonp包才可以

    npm install jsonp --save-dev(安装)

    import jsonp from 'jsonp'(引入)

    使用例子:

    getList: function () {

    jsonp(url, null, (err, data) => {

    if (err) {

    console.error(err.message);

    } else {

    if (data.list.length > 0) {

    console.log(data);

    }

    }

    })

    }

    10.3.3)ngnix配置反向代理,代理到api服务器

    11)vue router怎么传参

    params: /router1/:id,/router1/123,这里的id叫做params

    query: /router1?id=123,/router1?id=456,这里的ID叫做query

    query不设置也可传参,但是params不设置的时候,刷新页面或者返回参数会丢失,query并不会出现这种情况

    this.$router.push()方法中path不能与params一起使用,否则params无效path与query一起(在目标页面通过this.$route.query获取参数),params与name一起(目标页面通过this.$route.params获取参数)

    12)用的同一个组件时,路由参数变化,但是并不会刷新数据怎么办?

    例如从user/foo导航到user/bar,原来的组件实例会被复用,因为这两个路由渲染同个组件,比起销毁再创建,复用显得更加高效,不过这也意味着组件的生命周期钩子不会再调用,也就是路由参数发生了变化,但是组件还是那个组件,此时并不会刷新数据,不过官网提出了相应的解决方案:复用组件时候,想对路由参数的变化做出响应的话,可以简单的watch $route对象

    watch :{

    '$route': (to, from) {

    //对路由变化做出响应...

    }

    }

    还有一个新的方案,我还没有实践,大家可以试一试:

    也就是key,key是来阻止服用的,vue为你提供了一种方式来声明这两个元素是完全独立的,不要复用他们,只需要添加一个具有唯一值的key属性即可,所以给<router-view></router-view>添加一个key,如下

    <router-view :key="key"></router-view>

    computed: {

        key () {

            return this.$route.name!undefined?this.$route.name+new Date():this.$route+new Date()

        }

    }

    如有问题,欢迎大家指正,喜欢就给我一个小心心吧


    相关文章

      网友评论

      本文标题:vue安装入门以及常见问题总结(从安装到路由,持续更新中)

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