前端项目开发<Vue>

一、项目开发配置

1、项目搭建

1.1、项目安装:
1.2、项目结构:

2、框架引入:

2.1、css相关:
2.2、图标样式:
2.3、轮播图框架:
  • vue-awesome-swiper
    参考:链接一
    使用:
      //这里使用@的意思为安装指定的版本
      npm install vue-awesome-swiper@v2.6.7 --save
    
2.4、插件:
  • better-scroll :移动端滚动插件解决移动端各种滚动场景需求的开源插件,适用于滚动列表、选择器、轮播图、索引列表、开屏引导等应用场景。点击进入下载 better-scroll
    使用:
      //html
      <div class="wrapper" ref=“wrapper”>
        <ul class="content">
          <li>...</li>
          <li>...</li>
          ...
        </ul>
      <!-- you can put some other DOMs here, it won't affect the scrolling -->
      </div>
    
       //js
      import BScroll from 'better-scroll'
      const wrapper = document.querySelector('.wrapper')
      const scroll = new BScroll(wrapper)
    
      //或者:
      import BScroll from 'better-scroll'
      const scroll = new BScroll('.wrapper')
    
    注:在vue中,可以通过在元素上添加ref的语法来获取
      const scroll = new BScroll(this.$refs.wrapper)  //wrapper为自定义的名字,元素上ref中的值
    

二、项目开发代码

1、代码技巧

1.1、简写导入目录:

说明:在项目开发中,在一个js或css文件中如果导入其他目录下的相关文件,就需要通过如下方式,
示例:

<style>
    @import url('../../assets/style/fontStyle.css');
</style>

但如果每次都导入同一目录下的文件,会比较麻烦,就可以通过设置简写路径达到同样的导入效果
配置方法如下,其中key值为自定义的简写名称(如stylePath),value值为配置的路径
示例:

//在{项目目录}\build\webpack.dev.conf.js文件中
resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
      'stylePath': resolve('src/assets/styles'),  //在这里进行配置简写别名
    }
  },
//使用如下,这里使用了stylus的框架
<style lang="stylus" scoped>
    @import "~stylePath/border.styl"
</style>

2、Vuex的使用及注意点

2.1、Vuex的使用:
  • 显式安装Vuex:

      import Vue from 'vue'
      import Vuex from 'vuex'
    
      Vue.use(Vuex)
    

    注:当使用全局 script 标签引用 Vuex 时,不需要以上安装过程。

  • 创建store:

     // 如果在模块化构建系统中,请确保在开头调用了 Vue.use(Vuex)
    
     const store = new Vuex.Store({
       state: {
         count: 0
       },
       mutations: {
         increment (state) {
           state.count++
         }
       }
     })
    
       //触发状态变更
      //commit可接收多个参数,第一个参数(如increment)为方法名,第二个及之后的参数为方法(如increment)中接收的参数
       store.commit('increment') 
    
       console.log(store.state.count) // -> 1
    
  • 注入store:
    Vuex 通过 store 选项,提供了一种机制将状态从根组件“注入”到每一个子组件中(需调用 Vue.use(Vuex))

        const app = new Vue({
           el: '#app',
           // 把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件
           store,
           components: { Counter },
           template: `
            <div class="app">
              <counter></counter>
            </div>
            `
         })
    

3、router-link 的使用技巧

3.1、使用:

在需要跳转的元素外包裹一层<router-link></router-link> ,使用to 语法即可跳转到指定的页面中

    <ul>
        <router-link to="/">
            <li>
                //....
            </li>
        </router-link>
    </ul>
3.2、技巧:

实际上,HTML会将router-link 渲染成<a> 标签
这就会导致被router-link 包裹的元素中的文字显示成<a> 默认的蓝色样式,可通过如下方式解决:

    <ul>
        <router-link
           tag="li"     
           to="/">
            //....
        </router-link>
    </ul>

使用tag将router-link 标记为li 标签,这样既保证了ul 中的子元素为li ,又保证了html在渲染的时候,不会讲router-link 渲染为a 标签

4、页面数据的缓存

4.1、使用:keep-alive

如果某一页面多次被访问,并且其中的数据基本保持不变,则可以使用页面缓存的技术:

    <keep-alive>
        <router-view/>
    </keep-alive>

注:当页面被缓存后,生命周期钩子mounted 方法则只会在第一次进入的时候,执行一次,就不会再执行了。但生命周期钩子方法activated 方法会每次调用

4.2、缓存数据的刷新:

但如果页面的数据根据传过来的参数来判定是否需要缓存和刷新数据,则可以通过生命周期的钩子activated 来实现数据的刷新

        mounted: {
            //首次进入,刷新数据
        },
        activated: {
            //再次进入,根据传入参数判断是否需要再次刷新数据
            if(lastFlag===this.flag) {
                //重新刷新数据
            }
        }
4.3、隔离某些页面的缓存:

如果通过keep-alive 进行页面的缓存,会将其包裹下的路由子页面都会被缓存,假如其中的某一子页面不需要被缓存,则可以通过exclude 语法将不需要缓存的页面隔离出去,保证其每次都会重新加载请求:

    <keep-alive exclude="Detail">
        <router-view/>
    </keep-alive>

注:

  • 其中的Detail为指定的路由页面,文件名称:Detail.vue
  • 则每次进入页面,生命周期钩子函数mounted 都会被重新执行

5、多页面的拖动影响

5.1、问题说明:

当在一个页面拖动到底部的某个位置的时候,再点击其中的一个元素进入到下一个页面,则进入的这个页面也会被拖到相同的位置,这就造成了多页面的拖动影响

5.2、解决办法:

在路由配置中,加入一项scrollBescrollBehavior ,即每次进行路由切换的时候,让页面的初始位置为指定的x和y值

    export default new Router({
        routes: [{
            path: "/",  //根路径
            name: "Home",   //名称
            component: Home //组件名称
        }, {
            path: "/city",  //指定路径
            name: "City",
            component: City
        }
        //....
        ],
        scrollBehavior (to, from, savedPosotion) {
            return { x: 0, y:0 }
        }
    });

6、页面支持IP访问

6.1、问题说明:

前端项目通过webpage 启动的,它不支持IP的形式进行页面访问,所以需要修改项目的默认配置项

6.2、解决方案:

在项目的根目录下的package.json文件中,进行如下配置:

"scripts": {
    "dev": "webpack-dev-server --host 0.0.0.0 --inline --progress --config build/webpack.dev.conf.js",
    ......
  },

注:主页增加了--host 0.0.0.0

7、兼容性问题

7.1、问题说明:

在某些浏览器和手机上不支持一些es6和vue的新特性,就会出现兼容性的问题

7.1、解决方案:

通过使用第三方框架库babel-polyfill来解决兼容性问题

  • 安装:
    npm install babel-polyfill --save
  • 使用:
    重启姓名服务器,在项目中直接引入代码即可
       import "babel-polyfill"
    

参考文章:https://blog.csdn.net/crazyfeeling/article/details/70241285

8、项目打包上线

  • 路径配置:
    如果需要将打包好的文件放到指定的目录中进行访问,则需要进行相应的配置:
    找到index.js文件,在build配置项中,进行如下配置:

      build: {
        ......
        assetsPublicPath: '/project',
        ......
      {
    

    注:其中的project就是需要配置的路径

  • 打包编译(build):
    npm run build
    vue脚手架工具会自动的对src目录下的源代码进行打包编译,生产一个能够被浏览器运行的代码,同时这套代码也被压缩了的。运行之后,显示Build complete即成功完成编译,会生产一个dist目录,此目录即为要上线的文件

  • 部署到服务器后台
    将打包好的文件dist中的文件放到服务器上的指定目录中即可

9、异步组件的使用:

9.1、使用方式:
  • 常规组件的写法:
        import HomeHeader from './components/HomeHeader.vue'
        export default {
          ......
          components: {
             HomeHeader: HomeHeader,
          }
          ......
        }
    
  • 异步组件的写法:
        import HomeHeader from './components/HomeHeader.vue'
        export default {
            ......
            components: {
                HomeHeader: () => import('./components/HomeHeader.vue'),
            }
            ......
        }
    
9.2、注意事项:
  • 使用异步加载可以避免一次性将数据全部加载完成,造成加载量过大
  • 只有当项目很庞大,app.js达到至少1MB以上的时候,才有必要使用异步加载组件进行拆分

三、相关参考

1、项目开发参考

1.1、集成自定义的模板脚手架:

四、相关问题

1、发布项目遇到图片找不到情况:

1.1、问题描述:
  • 在使用npm run build进行webpack打包后,发布的项目可能会遇到图片等找不到的情况。
1.2、解决方案:
  • “万能”解决办法:
    • 将config/index.js 里面的 assetsPublicPath:'/' 改为 assetsPublicPath:'./'
    • build/util.js里面的
        if (options.extract) {
           return ExtractTextPlugin.extract({
                  use: loaders,
                  fallback: 'vue-style-loader',
                  publicPath:'/'
        })
    
    将其中的publicPath 改为:publicPath:'../../' 就可以了。这样打包出来的路径就是正确的了。

说明:

  • 第一个是为了改变js中引入图片的路径,改为./ 就是指在当前路径,这个. 代表的路径就是assetsRoot+assetsSubDictionary,这里定位到dist/static/ ,加上图片前缀img,就可以找到了。
  • 第二种是为了改变vue文件中使用style样式里面例如background:url('xxx'),这样的路径,因为style最终变成css文件在dist/static/css 里面,我们的图片放在dist/static/img 中,那么加上../../ 变成dist目录下,默认的目录前缀是static,img是图片默认前缀,这样就可以定位到图片。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,071评论 25 707
  • 6月18日,星期天 今天是父亲节,也是忙碌的一天,原本计划下午给爸爸打个电话,可从中午代理补货,回访老顾客,晚上附...
    张于阅读 129评论 0 0
  • 又是一年七月,迎来了暑假,一如既往的各科作业,也随之而来,各式各样的作业都有,无论是看的书,批注的资料,要录音...
    懿靥阅读 173评论 1 1
  • 2018年2月16日 周五 晴 大年初一,我们早早起床带着儿子去拜年(老家的习俗早起去长辈家里磕头...
    肖肖109阅读 111评论 0 0