vue项目常见问题

vue项目常见问题

1. 如何输出HTML?

vue 语法中的“Mustache”语法 (双大括号) 只会将数据解释为普通文本,如想要输出真正的HTML,需使用 v-html 指令:

2. 如何绑定class值?

// 注意:class值需加引号

3.如何引入一个组件?

(1)通过 import 引入

import Loading from 'components/loading 

(2)在 components 中注册

components: {  
  'v-loading': Loading,
}  

(3)通过注册的标签在 template 中使用

  

4.如何设置全局变量?

如果多个组件都会用到同一变量,则可以把该变量设为全局变量,在组件中直接引用即可,例如:

// 在mian.js中设置全局图片基本url
Vue.prototype.resourceUrl = 'http://resource.breadoffer.com'
// 在组件中使用:
![](resourceUrl + obj.cover)

5.如何设置全局函数?

//在main.js中设置全局函数:
Vue.prototype.GetQueryString = function (name){ // 此函数为通过url截取所需字符串函数
    var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);
    if(r!=null)return  unescape(r[2]); return null;
}
// 在组件中使用函数
mounted(){
  this.id = this.GetQueryString('id'); // 需使用this
} 

6.SPA应用如何切换路由时改变title?

如需切换路由时改变对应列表页title,首先需安装插件 vue-wechat-title:

npm install vue-wechat-title

在main.js中引入插件:

Vue.use(require('vue-wechat-title'));  

在路由 router 下的 index.js 中配置:

/**搜索页面**/
  {
     path: '/search',
     name: 'Search',
     component: resolve => require(['@/components/search'], resolve),
     meta: {
        title: '面包求职-做个学院,一起烘焙面包。精选干货,内部推荐,行业招聘,行业动态,面包新闻。'
      },
    },  

在组件中使用:

7.如何改变详情页title?

// 在main.js中设置全局函数
 Vue.prototype.setTitle = function (title) {
   var u = navigator.userAgent
   var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1
   var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)
   if (isAndroid) {
    document.title = title
   } else if (isiOS) {
    var $body = $('body')
    document.title = title
    var $iframe = $('')
    $iframe.on('load', function () {
     window.setTimeout(function () {
      $iframe.off('load').remove()
     }, 0)
    }).appendTo($body)
  }
} 

// 在组件中调用: 
this.setTitle(item.title)

8.父组件如何将值传递到子组件?

组件实例的作用域是孤立的。在子组件的模板内不能直接引用父组件的数据,所以父组件的数据需要通过 prop 才能下发到子组件中。

(1)首先在父组件中传值:


(2)然后在子组件中接收(像data一样,prop可以在模板中直接使用):

 export default{
  props:['message'], // 声明预期的数据
}   

注:如果想要传递动态的值,则需要使用v-bind来动态地将 prop 绑定到父组件(传递数值也需使用v-bind)

// 父组件:   
  

export default{
  data(){
    return{
        msg:'hello',
    }
 }
}  

9.如何修改父组件传递到子组件的值?

prop 作为初始值传入后,子组件想把它当作局部数据来用

(1) 首先在子组件的data中创建 传递值likeNum 的副本

export default{
  props:['likedNum'], // 声明预期的数据
  data(){
    return{
      mylikeNum:this.likedNum, // 在data中创建likedNum的副本,实现改变数据
    }
  },
} 

(2) 之后在监听函数中实现数据双向绑定

watch:{
    likedNum(val){
      this.mylikeNum = val; // 监听外部对 props 属性 likedNum 的变更,并同步到组件内的 data 属性 mylikeNum 中
    }
  }, 

(3) 在方法中对 传递值likeNum 进行操作

 methods:{
    thumb(){
        var self = this; 
        self.mylikeNum ++;
    }
 }  

10.mounted方法注意事项:

mounted执行时机:el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用,但是mounted在执行时并不会将所有子组件也都一起被挂载,如果想要整个视图都渲染完毕,可以用 vm.$nextTick:

mounted: function () {
  this.$nextTick(function () {
     do something...
  })
}

11.如何使用路由懒加载?

/**首页**/
{
  path: '/index',
  name: 'Index',
  component: resolve => require(['@/components/index'], resolve), // 运行时按需加载
}, 

注:组件异步加载也可用此方法

12.如何去掉url中的 # 号?

vue-router 默认 hash 模式 ,如果项目中使用了路由,则直接使用路由的history模式即可:

注: 在history模式下,需后台配置支持,前端应该在 Vue 应用里面覆盖所有的路由情况,然后在给出一个 404 页面。

具体详情请参考: https://router.vuejs.org/zh-cn/essentials/history-mode.html

{
  mode: 'history',
  routes: [
    /**404页面**/
    {
      path: '*',
      name:'Error',
      redirect: '/error/404',
    },
  ]  

13.如何解决webpack打包后页面空白无法显示?

找到 config 文件夹下的 index.js,修改里面的 assetsPublicPath 路径,将 ‘ / ’ 改为 ‘ . / ’,

module.exports = {
  //打包时使用的配置
  build: {
    env: require('./prod.env'), // // webpack的编译环境
    index: path.resolve(__dirname, '../dist/index.html'), //编译输入的index.html文件
    assetsRoot: path.resolve(__dirname, '../dist'), // webpack输出的目标文件夹路径
    assetsSubDirectory: 'static', // webpack编译输出的二级文件夹
    assetsPublicPath: './', // webpack编译输出的发布路径
    productionSourceMap: true,
    productionGzip: false,
    productionGzipExtensions: ['js', 'css'],
    bundleAnalyzerReport: process.env.npm_config_report
  },
}

14.如何处理webpack不能编译多行省略属性问题?

在多行省略的css样式中添加如下代码:

/* autoprefixer: off*/
  -webkit-box-orient: vertical;
/* autoprefixer: on*/ 

15.如何处理插件moment.js在火狐及移动端不兼容问题?

moment.js如果想把日期格式渲染为(月,日,年)英文格式,代码需要修改为:

Vue.filter('Moment' , function(date) {
  return moment(date,'YYYYMMDD').format('MMMM Do, YYYY') // 需在data后添加‘YYYYMMDD’,转化后日期格式为:April 13th, 2017
}); 

16.如何解决 iview 中 Icon 图标组件打包后丢失问题?

在 build / webpack.prod.conf.js 中,将里边的 extract 改为 false,默认为 true

module: {
    rules: utils.styleLoaders({
      sourceMap: config.build.productionSourceMap,
      extract: false
    })
 }, 

17.关于v-for 遍历数组时的参数顺序问题

当包含index时,之前1.0版本遍历数组时的参数顺序是(index,value), 但现在是(value,index)

  • 18.$index 在2.0中已经移除

    在1.0中,例如在点击事件中想要获取元素下标,可通过变量 $index 获取,但是在2.0中已经移除

    你可能感兴趣的:(vue项目常见问题)