前端-Vue.js的通读使用(二)-webpack和vue-router

1、webpack。

1、WebPack 是一款模块加载器兼打包工具,它能把各种资源,如JS/JSX/ES6/SASS/LESS/图片等作为模块来处理和使用,

2、安装命令:

cnpm install webpack -g
cnpm install webpack-cli -g

3、使用,在项目的build目录里存有webpack.base.js(基础)、webpack.dev.js(开发)、webpack.prod.js(生产)三个环境配置文件,节点说明:

  • entry:入口文件,指定WebPack用哪个文件作为项目的入口
  • output:输出,指定WebPack把处理完成的文件放置到指定路径
  • module:模块,用于处理各种类型的文件
  • plugins:插件,如热更新,代码重用
  • resolve:设置路径指向
  • watch:监听,用于设置文件改动后直接打包。

 4、三个 webpack.xxx.conf 的区别:

npm run build是自定义添加的命令,package.json里面:scripts中应该有build命令的详细对应命令,某种意义上这算是一种alias,一种别名,npm run build也许是用的webpack另外加了一些参数,也有可能是用其他的打包命令

一直有点疑问webpack命名的问题,有很多的名字,也是醉了,就比如:

webpack.base.config.js
webpack.config.js 
webpack.production.js
webpack.devserver.js
webpack.........
查询了一下才知道:原来是随便命名的..........

1.这些文件都是有什么不同 ,还是随意取名?

webpack默认只认识webpack.config.js,只有这个是默认的,只有这个是默认的,默认的...

名字是可以随意取的,但是我们取名是为了让一些东西有意义不是?
prod用于生产打包,dev用于开发打包,可以想象,prod和dev肯定有一部分配置相同,再加上一些不同的配置。所以相同的配置都放到base里面去,然后prod和dev再引入base,增加各自不同的细节。

2.webpack怎么识别?

看你的package.json,名字是可以随便取的,最终看你package.json调用哪个js,package.json的scripts里调用

 3,执行npm run dev 或者  npm run build 的区别:

 npm run dev:可以看到,该命令加载的是webpack.dev.conf.js文件,属于开发环境。

npm run build: 编译时使用的build.js文件,通过build.js文件里可以看到代理加载了webpack.prod.js里面的配置,属于生产环境。

 

 

 1、vue-router。

1、Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:

  • 嵌套的路由/视图表
  • 模块化的、基于组件的路由配置
  • 路由参数、查询、通配符
  • 基于 Vue.js 过渡系统的视图过渡效果
  • 细粒度的导航控制
  • 带有自动激活的 CSS class 的链接
  • HTML5 历史模式或 hash 模式,在 IE9 中自动降级
  • 自定义的滚动条行为

2、安装命令:

cnpm install vue-router --save-dev

 3、创建router.config.js文件,以方便路由的管理:

 4、创建两个测试组件 Home、News:

 

  5、配置router.config.js文件进行组件加载:

//路由配置文件

//导入vue和vue-router模块
import VueRouter from 'vue-router'
import  Vue from 'vue'

//导入自定义组件
import Home from '../components/Home'
import News from '../components/News'

//Vue启用Router
Vue.use(VueRouter);

export default new VueRouter({
  routes:[
    {
      //跳转url路径
      path: '/home',
      //对应的组件
      component: Home
    },
    {
      path: '/news',
      component: News
    }
  ]

})

 6、在main.js中引入router进行使用: 

import Vue from 'vue'
import App from './App'

import router from './router/router.config'

Vue.config.productionTip=false

new Vue({
  el: '#app',
//让vue使用router模块
  router,
  render: h => h(App),
})

  7、在App.vue中引入router标签即可实现路由功能:

 

 

 8、router传参的两种方式:

1-1、增加name属性,用来绑定跳转地址:

1-2、标签中进行绑定:

1-3、在对应页面中接受参数值:

 

 

 

2-1、更改props属性为true:

2-2、以props方式接受参数:

 

  9、路由的两种模式:

 

 

 

 

 

 

  

 

permission.js:130 [Vue warn]: Error in render: "TypeError: Cannot read properties of null (reading 'phenomenon')" found in ---> <Defpaltodaily> at src/views/mes/defpaltodaily/index.vue <AppMain> at src/layout/components/AppMain.vue <Layout> at src/layout/index.vue <App> at src/App.vue <Root> warn @ vue.runtime.esm.js:620 logError @ vue.runtime.esm.js:1883 globalHandleError @ vue.runtime.esm.js:1878 handleError @ vue.runtime.esm.js:1838 Vue._render @ vue.runtime.esm.js:3544 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 merged @ vue.runtime.esm.js:3298 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 patch @ vue.runtime.esm.js:6467 Vue._update @ vue.runtime.esm.js:3939 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 patch @ vue.runtime.esm.js:6467 Vue._update @ vue.runtime.esm.js:3939 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 createChildren @ vue.runtime.esm.js:6043 createElm @ vue.runtime.esm.js:5944 patch @ vue.runtime.esm.js:6467 Vue._update @ vue.runtime.esm.js:3939 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 createChildren @ vue.runtime.esm.js:6043 createElm @ vue.runtime.esm.js:5944 createChildren @ vue.runtime.esm.js:6043 createElm @ vue.runtime.esm.js:5944 patch @ vue.runtime.esm.js:6467 Vue._update @ vue.runtime.esm.js:3939 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 merged @ vue.runtime.esm.js:3298 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 updateChildren @ vue.runtime.esm.js:6206 patchVnode @ vue.runtime.esm.js:6309 patch @ vue.runtime.esm.js:6472 Vue._update @ vue.runtime.esm.js:3942 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 run @ vue.runtime.esm.js:4548 flushSchedulerQueue @ vue.runtime.esm.js:4304 eval @ vue.runtime.esm.js:1979 flushCallbacks @ vue.runtime.esm.js:1905 Promise.then timerFunc @ vue.runtime.esm.js:1932 nextTick @ vue.runtime.esm.js:1989 queueWatcher @ vue.runtime.esm.js:4396 update @ vue.runtime.esm.js:4538 notify @ vue.runtime.esm.js:731 reactiveSetter @ vue.runtime.esm.js:1056 eval @ vue-router.esm.js:2933 eval @ vue-router.esm.js:2932 updateRoute @ vue-router.esm.js:2353 eval @ vue-router.esm.js:2207 eval @ vue-router.esm.js:2341 step @ vue-router.esm.js:1945 step @ vue-router.esm.js:1952 step @ vue-router.esm.js:1952 runQueue @ vue-router.esm.js:1956 eval @ vue-router.esm.js:2336 step @ vue-router.esm.js:1945 eval @ vue-router.esm.js:1949 eval @ vue-router.esm.js:2323 eval @ vue-router.esm.js:2071 eval @ vue-router.esm.js:2147 eval @ permission.js:130 Promise.then eval @ permission.js:130 eval @ vue-router.esm.js:2088 eval @ vue-router.esm.js:2115 eval @ vue-router.esm.js:2115 flatMapComponents @ vue-router.esm.js:2114 eval @ vue-router.esm.js:2050 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 step @ vue-router.esm.js:1952 step @ vue-router.esm.js:1952 eval @ vue-router.esm.js:1949 eval @ vue-router.esm.js:2323 eval @ permission.js:41 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 runQueue @ vue-router.esm.js:1956 confirmTransition @ vue-router.esm.js:2331 transitionTo @ vue-router.esm.js:2204 replace @ vue-router.esm.js:2557 eval @ vue-router.esm.js:2317 eval @ permission.js:32 Promise.then eval @ permission.js:29 Promise.then eval @ permission.js:27 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 runQueue @ vue-router.esm.js:1956 confirmTransition @ vue-router.esm.js:2331 transitionTo @ vue-router.esm.js:2204 init @ vue-router.esm.js:2924 beforeCreate @ vue-router.esm.js:1272 invokeWithErrorHandling @ vue.runtime.esm.js:1853 callHook @ vue.runtime.esm.js:4213 Vue._init @ vue.runtime.esm.js:4994 Vue @ vue.runtime.esm.js:5075 eval @ main.js:82 ./src/main.js @ app.js:5789 __webpack_require__ @ app.js:854 fn @ app.js:151 1 @ app.js:6856 __webpack_require__ @ app.js:854 checkDeferredModules @ app.js:46 (匿名) @ app.js:994 (匿名) @ app.js:997 permission.js:130 TypeError: Cannot read properties of null (reading 'phenomenon') at eval (cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"77d5fc12-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/mes/defpaltodaily/index.vue?vue&type=template&id=11948e6d:422:46) at Proxy.renderList (vue.runtime.esm.js:2648:18) at Proxy.render (cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"77d5fc12-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/mes/defpaltodaily/index.vue?vue&type=template&id=11948e6d:420:17) at Vue._render (vue.runtime.esm.js:3542:22) at VueComponent.updateComponent (vue.runtime.esm.js:4060:21) at Watcher.get (vue.runtime.esm.js:4473:25) at new Watcher (vue.runtime.esm.js:4462:12) at mountComponent (vue.runtime.esm.js:4067:3) at Vue.$mount (vue.runtime.esm.js:8405:10) at init (vue.runtime.esm.js:3115:13) logError @ vue.runtime.esm.js:1887 globalHandleError @ vue.runtime.esm.js:1878 handleError @ vue.runtime.esm.js:1838 Vue._render @ vue.runtime.esm.js:3544 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 merged @ vue.runtime.esm.js:3298 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 patch @ vue.runtime.esm.js:6467 Vue._update @ vue.runtime.esm.js:3939 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 patch @ vue.runtime.esm.js:6467 Vue._update @ vue.runtime.esm.js:3939 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 createChildren @ vue.runtime.esm.js:6043 createElm @ vue.runtime.esm.js:5944 patch @ vue.runtime.esm.js:6467 Vue._update @ vue.runtime.esm.js:3939 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 createChildren @ vue.runtime.esm.js:6043 createElm @ vue.runtime.esm.js:5944 createChildren @ vue.runtime.esm.js:6043 createElm @ vue.runtime.esm.js:5944 patch @ vue.runtime.esm.js:6467 Vue._update @ vue.runtime.esm.js:3939 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 merged @ vue.runtime.esm.js:3298 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 updateChildren @ vue.runtime.esm.js:6206 patchVnode @ vue.runtime.esm.js:6309 patch @ vue.runtime.esm.js:6472 Vue._update @ vue.runtime.esm.js:3942 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 run @ vue.runtime.esm.js:4548 flushSchedulerQueue @ vue.runtime.esm.js:4304 eval @ vue.runtime.esm.js:1979 flushCallbacks @ vue.runtime.esm.js:1905 Promise.then timerFunc @ vue.runtime.esm.js:1932 nextTick @ vue.runtime.esm.js:1989 queueWatcher @ vue.runtime.esm.js:4396 update @ vue.runtime.esm.js:4538 notify @ vue.runtime.esm.js:731 reactiveSetter @ vue.runtime.esm.js:1056 eval @ vue-router.esm.js:2933 eval @ vue-router.esm.js:2932 updateRoute @ vue-router.esm.js:2353 eval @ vue-router.esm.js:2207 eval @ vue-router.esm.js:2341 step @ vue-router.esm.js:1945 step @ vue-router.esm.js:1952 step @ vue-router.esm.js:1952 runQueue @ vue-router.esm.js:1956 eval @ vue-router.esm.js:2336 step @ vue-router.esm.js:1945 eval @ vue-router.esm.js:1949 eval @ vue-router.esm.js:2323 eval @ vue-router.esm.js:2071 eval @ vue-router.esm.js:2147 eval @ permission.js:130 Promise.then eval @ permission.js:130 eval @ vue-router.esm.js:2088 eval @ vue-router.esm.js:2115 eval @ vue-router.esm.js:2115 flatMapComponents @ vue-router.esm.js:2114 eval @ vue-router.esm.js:2050 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 step @ vue-router.esm.js:1952 step @ vue-router.esm.js:1952 eval @ vue-router.esm.js:1949 eval @ vue-router.esm.js:2323 eval @ permission.js:41 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 runQueue @ vue-router.esm.js:1956 confirmTransition @ vue-router.esm.js:2331 transitionTo @ vue-router.esm.js:2204 replace @ vue-router.esm.js:2557 eval @ vue-router.esm.js:2317 eval @ permission.js:32 Promise.then eval @ permission.js:29 Promise.then eval @ permission.js:27 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 runQueue @ vue-router.esm.js:1956 confirmTransition @ vue-router.esm.js:2331 transitionTo @ vue-router.esm.js:2204 init @ vue-router.esm.js:2924 beforeCreate @ vue-router.esm.js:1272 invokeWithErrorHandling @ vue.runtime.esm.js:1853 callHook @ vue.runtime.esm.js:4213 Vue._init @ vue.runtime.esm.js:4994 Vue @ vue.runtime.esm.js:5075 eval @ main.js:82 ./src/main.js @ app.js:5789 __webpack_require__ @ app.js:854 fn @ app.js:151 1 @ app.js:6856 __webpack_require__ @ app.js:854 checkDeferredModules @ app.js:46 (匿名) @ app.js:994 (匿名) @ app.js:997 permission.js:130 [Vue warn]: Error in nextTick: "Error: Initialize failed: invalid dom." found in ---> <Defpaltodaily> at src/views/mes/defpaltodaily/index.vue <AppMain> at src/layout/components/AppMain.vue <Layout> at src/layout/index.vue <App> at src/App.vue <Root> warn @ vue.runtime.esm.js:620 logError @ vue.runtime.esm.js:1883 globalHandleError @ vue.runtime.esm.js:1878 handleError @ vue.runtime.esm.js:1838 eval @ vue.runtime.esm.js:1981 flushCallbacks @ vue.runtime.esm.js:1905 Promise.then timerFunc @ vue.runtime.esm.js:1932 nextTick @ vue.runtime.esm.js:1989 Vue.$nextTick @ vue.runtime.esm.js:3515 mounted @ element-ui.common.js:32728 invokeWithErrorHandling @ vue.runtime.esm.js:1853 callHook @ vue.runtime.esm.js:4213 insert @ vue.runtime.esm.js:3136 invokeInsertHook @ vue.runtime.esm.js:6336 patch @ vue.runtime.esm.js:6555 Vue._update @ vue.runtime.esm.js:3942 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 run @ vue.runtime.esm.js:4548 flushSchedulerQueue @ vue.runtime.esm.js:4304 eval @ vue.runtime.esm.js:1979 flushCallbacks @ vue.runtime.esm.js:1905 Promise.then timerFunc @ vue.runtime.esm.js:1932 nextTick @ vue.runtime.esm.js:1989 queueWatcher @ vue.runtime.esm.js:4396 update @ vue.runtime.esm.js:4538 notify @ vue.runtime.esm.js:731 reactiveSetter @ vue.runtime.esm.js:1056 eval @ vue-router.esm.js:2933 eval @ vue-router.esm.js:2932 updateRoute @ vue-router.esm.js:2353 eval @ vue-router.esm.js:2207 eval @ vue-router.esm.js:2341 step @ vue-router.esm.js:1945 step @ vue-router.esm.js:1952 step @ vue-router.esm.js:1952 runQueue @ vue-router.esm.js:1956 eval @ vue-router.esm.js:2336 step @ vue-router.esm.js:1945 eval @ vue-router.esm.js:1949 eval @ vue-router.esm.js:2323 eval @ vue-router.esm.js:2071 eval @ vue-router.esm.js:2147 eval @ permission.js:130 Promise.then eval @ permission.js:130 eval @ vue-router.esm.js:2088 eval @ vue-router.esm.js:2115 eval @ vue-router.esm.js:2115 flatMapComponents @ vue-router.esm.js:2114 eval @ vue-router.esm.js:2050 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 step @ vue-router.esm.js:1952 step @ vue-router.esm.js:1952 eval @ vue-router.esm.js:1949 eval @ vue-router.esm.js:2323 eval @ permission.js:41 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 runQueue @ vue-router.esm.js:1956 confirmTransition @ vue-router.esm.js:2331 transitionTo @ vue-router.esm.js:2204 replace @ vue-router.esm.js:2557 eval @ vue-router.esm.js:2317 eval @ permission.js:32 Promise.then eval @ permission.js:29 Promise.then eval @ permission.js:27 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 runQueue @ vue-router.esm.js:1956 confirmTransition @ vue-router.esm.js:2331 transitionTo @ vue-router.esm.js:2204 init @ vue-router.esm.js:2924 beforeCreate @ vue-router.esm.js:1272 invokeWithErrorHandling @ vue.runtime.esm.js:1853 callHook @ vue.runtime.esm.js:4213 Vue._init @ vue.runtime.esm.js:4994 Vue @ vue.runtime.esm.js:5075 eval @ main.js:82 ./src/main.js @ app.js:5789 __webpack_require__ @ app.js:854 fn @ app.js:151 1 @ app.js:6856 __webpack_require__ @ app.js:854 checkDeferredModules @ app.js:46 (匿名) @ app.js:994 (匿名) @ app.js:997 permission.js:130 Error: Initialize failed: invalid dom. at Module.init (echarts.js:2342:15) at VueComponent.eval (VM32918 index.vue:360:34) at Array.eval (vue.runtime.esm.js:1979:12) at flushCallbacks (vue.runtime.esm.js:1905:14) logError @ vue.runtime.esm.js:1887 globalHandleError @ vue.runtime.esm.js:1878 handleError @ vue.runtime.esm.js:1838 eval @ vue.runtime.esm.js:1981 flushCallbacks @ vue.runtime.esm.js:1905 Promise.then timerFunc @ vue.runtime.esm.js:1932 nextTick @ vue.runtime.esm.js:1989 Vue.$nextTick @ vue.runtime.esm.js:3515 mounted @ element-ui.common.js:32728 invokeWithErrorHandling @ vue.runtime.esm.js:1853 callHook @ vue.runtime.esm.js:4213 insert @ vue.runtime.esm.js:3136 invokeInsertHook @ vue.runtime.esm.js:6336 patch @ vue.runtime.esm.js:6555 Vue._update @ vue.runtime.esm.js:3942 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 run @ vue.runtime.esm.js:4548 flushSchedulerQueue @ vue.runtime.esm.js:4304 eval @ vue.runtime.esm.js:1979 flushCallbacks @ vue.runtime.esm.js:1905 Promise.then timerFunc @ vue.runtime.esm.js:1932 nextTick @ vue.runtime.esm.js:1989 queueWatcher @ vue.runtime.esm.js:4396 update @ vue.runtime.esm.js:4538 notify @ vue.runtime.esm.js:731 reactiveSetter @ vue.runtime.esm.js:1056 eval @ vue-router.esm.js:2933 eval @ vue-router.esm.js:2932 updateRoute @ vue-router.esm.js:2353 eval @ vue-router.esm.js:2207 eval @ vue-router.esm.js:2341 step @ vue-router.esm.js:1945 step @ vue-router.esm.js:1952 step @ vue-router.esm.js:1952 runQueue @ vue-router.esm.js:1956 eval @ vue-router.esm.js:2336 step @ vue-router.esm.js:1945 eval @ vue-router.esm.js:1949 eval @ vue-router.esm.js:2323 eval @ vue-router.esm.js:2071 eval @ vue-router.esm.js:2147 eval @ permission.js:130 Promise.then eval @ permission.js:130 eval @ vue-router.esm.js:2088 eval @ vue-router.esm.js:2115 eval @ vue-router.esm.js:2115 flatMapComponents @ vue-router.esm.js:2114 eval @ vue-router.esm.js:2050 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 step @ vue-router.esm.js:1952 step @ vue-router.esm.js:1952 eval @ vue-router.esm.js:1949 eval @ vue-router.esm.js:2323 eval @ permission.js:41 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 runQueue @ vue-router.esm.js:1956 confirmTransition @ vue-router.esm.js:2331 transitionTo @ vue-router.esm.js:2204 replace @ vue-router.esm.js:2557 eval @ vue-router.esm.js:2317 eval @ permission.js:32 Promise.then eval @ permission.js:29 Promise.then eval @ permission.js:27 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 runQueue @ vue-router.esm.js:1956 confirmTransition @ vue-router.esm.js:2331 transitionTo @ vue-router.esm.js:2204 init @ vue-router.esm.js:2924 beforeCreate @ vue-router.esm.js:1272 invokeWithErrorHandling @ vue.runtime.esm.js:1853 callHook @ vue.runtime.esm.js:4213 Vue._init @ vue.runtime.esm.js:4994 Vue @ vue.runtime.esm.js:5075 eval @ main.js:82 ./src/main.js @ app.js:5789 __webpack_require__ @ app.js:854 fn @ app.js:151 1 @ app.js:6856 __webpack_require__ @ app.js:854 checkDeferredModules @ app.js:46 (匿名) @ app.js:994 (匿名) @ app.js:997 VM32918 index.vue:368 [Vue warn]: Error in render: "TypeError: Cannot read properties of null (reading 'phenomenon')" found in ---> <Defpaltodaily> at src/views/mes/defpaltodaily/index.vue <AppMain> at src/layout/components/AppMain.vue <Layout> at src/layout/index.vue <App> at src/App.vue <Root> warn @ vue.runtime.esm.js:620 logError @ vue.runtime.esm.js:1883 globalHandleError @ vue.runtime.esm.js:1878 handleError @ vue.runtime.esm.js:1838 Vue._render @ vue.runtime.esm.js:3544 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 run @ vue.runtime.esm.js:4548 flushSchedulerQueue @ vue.runtime.esm.js:4304 eval @ vue.runtime.esm.js:1979 flushCallbacks @ vue.runtime.esm.js:1905 Promise.then timerFunc @ vue.runtime.esm.js:1932 nextTick @ vue.runtime.esm.js:1989 queueWatcher @ vue.runtime.esm.js:4396 update @ vue.runtime.esm.js:4538 notify @ vue.runtime.esm.js:731 reactiveSetter @ vue.runtime.esm.js:1056 proxySetter @ vue.runtime.esm.js:4625 eval @ VM32918 index.vue:368 Promise.then getList @ VM32918 index.vue:367 created @ VM32918 index.vue:354 invokeWithErrorHandling @ vue.runtime.esm.js:1853 callHook @ vue.runtime.esm.js:4213 Vue._init @ vue.runtime.esm.js:4998 VueComponent @ vue.runtime.esm.js:5144 createComponentInstanceForVnode @ vue.runtime.esm.js:3280 init @ vue.runtime.esm.js:3111 merged @ vue.runtime.esm.js:3298 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 patch @ vue.runtime.esm.js:6467 Vue._update @ vue.runtime.esm.js:3939 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 patch @ vue.runtime.esm.js:6467 Vue._update @ vue.runtime.esm.js:3939 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 createChildren @ vue.runtime.esm.js:6043 createElm @ vue.runtime.esm.js:5944 patch @ vue.runtime.esm.js:6467 Vue._update @ vue.runtime.esm.js:3939 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 createChildren @ vue.runtime.esm.js:6043 createElm @ vue.runtime.esm.js:5944 createChildren @ vue.runtime.esm.js:6043 createElm @ vue.runtime.esm.js:5944 patch @ vue.runtime.esm.js:6467 Vue._update @ vue.runtime.esm.js:3939 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 Watcher @ vue.runtime.esm.js:4462 mountComponent @ vue.runtime.esm.js:4067 Vue.$mount @ vue.runtime.esm.js:8405 init @ vue.runtime.esm.js:3115 merged @ vue.runtime.esm.js:3298 createComponent @ vue.runtime.esm.js:5968 createElm @ vue.runtime.esm.js:5915 updateChildren @ vue.runtime.esm.js:6206 patchVnode @ vue.runtime.esm.js:6309 patch @ vue.runtime.esm.js:6472 Vue._update @ vue.runtime.esm.js:3942 updateComponent @ vue.runtime.esm.js:4060 get @ vue.runtime.esm.js:4473 run @ vue.runtime.esm.js:4548 flushSchedulerQueue @ vue.runtime.esm.js:4304 eval @ vue.runtime.esm.js:1979 flushCallbacks @ vue.runtime.esm.js:1905 Promise.then timerFunc @ vue.runtime.esm.js:1932 nextTick @ vue.runtime.esm.js:1989 queueWatcher @ vue.runtime.esm.js:4396 update @ vue.runtime.esm.js:4538 notify @ vue.runtime.esm.js:731 reactiveSetter @ vue.runtime.esm.js:1056 eval @ vue-router.esm.js:2933 eval @ vue-router.esm.js:2932 updateRoute @ vue-router.esm.js:2353 eval @ vue-router.esm.js:2207 eval @ vue-router.esm.js:2341 step @ vue-router.esm.js:1945 step @ vue-router.esm.js:1952 step @ vue-router.esm.js:1952 runQueue @ vue-router.esm.js:1956 eval @ vue-router.esm.js:2336 step @ vue-router.esm.js:1945 eval @ vue-router.esm.js:1949 eval @ vue-router.esm.js:2323 eval @ vue-router.esm.js:2071 eval @ vue-router.esm.js:2147 eval @ permission.js:130 Promise.then eval @ permission.js:130 eval @ vue-router.esm.js:2088 eval @ vue-router.esm.js:2115 eval @ vue-router.esm.js:2115 flatMapComponents @ vue-router.esm.js:2114 eval @ vue-router.esm.js:2050 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 step @ vue-router.esm.js:1952 step @ vue-router.esm.js:1952 eval @ vue-router.esm.js:1949 eval @ vue-router.esm.js:2323 eval @ permission.js:41 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 runQueue @ vue-router.esm.js:1956 confirmTransition @ vue-router.esm.js:2331 transitionTo @ vue-router.esm.js:2204 replace @ vue-router.esm.js:2557 eval @ vue-router.esm.js:2317 eval @ permission.js:32 Promise.then eval @ permission.js:29 Promise.then eval @ permission.js:27 iterator @ vue-router.esm.js:2301 step @ vue-router.esm.js:1948 runQueue @ vue-router.esm.js:1956 confirmTransition @ vue-router.esm.js:2331 transitionTo @ vue-router.esm.js:2204 init @ vue-router.esm.js:2924 beforeCreate @ vue-router.esm.js:1272 invokeWithErrorHandling @ vue.runtime.esm.js:1853 callHook @ vue.runtime.esm.js:4213 Vue._init @ vue.runtime.esm.js:4994 Vue @ vue.runtime.esm.js:5075 eval @ main.js:82 ./src/main.js @ app.js:5789 __webpack_require__ @ app.js:854 fn @ app.js:151 1 @ app.js:6856 __webpack_require__ @ app.js:854 checkDeferredModules @ app.js:46 (匿名) @ app.js:994 (匿名) @ app.js:997 VM32918 index.vue:368 TypeError: Cannot read properties of null (reading 'phenomenon')
最新发布
09-24
<think> 我们正在解决Vue项目中出现的两个错误: 1. TypeError: Cannot read properties of null (reading 'phenomenon') 2. Error: Initialize failed: invalid dom. 根据引用内容,这些错误通常数据未初始化或DOM操作不当有关。下面将逐步分析并提供解决方案。 ## 错误1分析:TypeError: Cannot read properties of null (reading 'phenomenon') 这个错误发生在尝试访问`null`对象的`phenomenon`属性时。根据引用[1][2][3],常见原因包括: - 异步数据未加载完成就尝试访问 - 变量未初始化或初始化为`null` - 对象属性路径不正确 ### 解决方案步骤 1. **检查数据初始化** 确保在访问`phenomenon`前,该对象已正确初始化: ```javascript data() { return { // 初始化对象,避免null selectList: [] } } ``` 2. **添加空值检查** 在访问深层属性前使用可选链操作符(Optional Chaining): ```javascript // 修改前 const phenomenon = item.defectsPmn; // 修改后:添加空值检查 const phenomenon = item?.defectsPmn || '未知现象'; ``` 3. **确保异步数据就绪** 如果`selectList`通过API获取,在渲染前检查数据是否存在: ```vue <template> <div v-if="selectList.length > 0"> <!-- 渲染表格 --> </div> <div v-else>加载中...</div> </template> ``` 4. **使用Vue生命周期钩子** 在`mounted`或`created`中确保数据加载完成: ```javascript async mounted() { await this.loadData(); // 等待数据加载 this.calculateSummary(); // 再执行计算 } ``` ## 错误2分析:Error: Initialize failed: invalid dom. 这个错误通常发生在第三方库尝试操作不存在的DOM元素时(引用[4])。常见原因包括: - 在DOM未渲染完成时初始化组件 - 错误的DOM选择器 - 组件销毁后仍尝试操作DOM ### 解决方案步骤 1. **确保DOM存在后再初始化** 使用`nextTick`确保DOM渲染完成: ```javascript import { nextTick } from 'vue'; methods: { async initChart() { await nextTick(); // 等待DOM更新 this.chart = echarts.init(document.getElementById('chart')); } } ``` 2. **检查DOM元素是否存在** 初始化前验证元素: ```javascript const domEl = document.getElementById('chart'); if (!domEl) return; // 防御性检查 ``` 3. **清理资源** 在组件销毁时销毁图表实例: ```javascript beforeUnmount() { if (this.chart) { this.chart.dispose(); // 避免内存泄漏 } } ``` 4. **避免v-if第三方库冲突** 使用`v-show`替代`v-if`保持DOM存在: ```vue <!-- 避免 --> <div v-if="showChart" id="chart"></div> <!-- 推荐 --> <div v-show="showChart" id="chart"></div> ``` ## 综合修复示例 结合两个错误的解决方案,修改原始代码: ```vue <template> <!-- 确保DOM存在 --> <div v-show="hasData"> <table><!-- 表格内容 --></table> </div> </template> <script> export default { data() { return { selectList: [], // 初始化为空数组 hasData: false // 控制DOM显示 } }, async mounted() { await this.loadData(); this.calculateSummary(); this.hasData = true; // 数据就绪后再显示DOM }, methods: { async loadData() { // 模拟API请求 this.selectList = await fetchDefectData(); }, calculateSummary() { // 添加空值保护 const defectStats = this.selectList.reduce((acc, item) => { const phenomenon = item?.defectsPmn ?? '未知现象'; // ...其余逻辑不变 }, {}); } } } </script> ``` ## 关键预防措施 1. **防御性编程**:始终检查变量是否为`null`或`undefined` 2. **异步控制**:使用`async/await`确保操作顺序 3. **生命周期管理**:在组件销毁时清理资源 4. **DOM操作时机**:通过`nextTick`确保DOM可用 > 对于第三方图表库(如ECharts),推荐使用Vue封装库(如`vue-echarts`)避免直接DOM操作[^4]。 通过以上步骤,可同时解决两个错误并预防类似问题发生。 §§相关问题§§ 1. Vue中如何处理深层嵌套对象的响应式丢失问题? 2. 如何优雅地处理Vue组件中的异步数据依赖? 3. Vue3组合式API下如何避免常见的DOM操作错误? </think> 针对 Vue 项目中出现的两个错误:`TypeError: Cannot read properties of null (reading 'phenomenon')` `Error: Initialize failed: invalid dom.`,以下是详细的解决方案: --- ### 错误1:`TypeError: Cannot read properties of null (reading 'phenomenon')` #### 原因分析 1. **数据未初始化**:`selectList` 中的某些项为 `null`,尝试访问 `item.defectsPmn` 时触发错误[^1][^2][^3] 2. **异步数据问题**:组件渲染时数据尚未加载完成 3. **对象路径错误**:尝试访问不存在的属性路径 #### 解决方案 ##### 1. 添加空值保护(推荐) ```javascript calculateSummary() { const defectStats = this.selectList.reduce((acc, item) => { // 使用可选链操作符空值合并 const phenomenon = item?.defectsPmn ?? '未知现象'; if (!acc[phenomenon]) { acc[phenomenon] = { /* 初始化 */ }; } // ...其余逻辑 }, {}); } ``` ##### 2. 增加防御性检查 ```javascript // 在访问缺陷现象前检查对象存在性 if (item && typeof item === 'object') { const phenomenon = item.defectsPmn || '未知现象'; // ...处理逻辑 } ``` ##### 3. 确保数据初始值 在组件数据中设置合理的初始值: ```javascript data() { return { selectList: [] // 确保初始为数组而非null } } ``` ##### 4. 处理异步数据加载 ```vue <template> <!-- 添加加载状态判断 --> <div v-if="isLoading">加载中...</div> <table v-else-if="selectList.length > 0"> <!-- 渲染表格 --> </table> </template> <script> export default { async mounted() { this.isLoading = true; try { this.selectList = await this.fetchData(); // 异步获取数据 } finally { this.isLoading = false; } } } </script> ``` --- ### 错误2:`Error: Initialize failed: invalid dom` #### 原因分析 1. **DOM 未准备就绪**:在 DOM 元素创建前尝试初始化组件[^4] 2. **v-if/v-show 冲突**:条件渲染导致 DOM 元素不存在 3. **第三方库初始化时机错误**:在 DOM 未挂载时调用初始化方法 #### 解决方案 ##### 1. 使用 nextTick 确保 DOM 就绪 ```javascript mounted() { this.$nextTick(() => { // 此时DOM已渲染完成 this.initThirdPartyLibrary(); }); } ``` ##### 2. 正确处理条件渲染 ```vue <template> <!-- 使用v-show代替v-if保持DOM存在 --> <div v-show="showChart" ref="chartContainer"></div> </template> <script> export default { methods: { initChart() { // 确保元素存在 if (this.$refs.chartContainer) { this.chart = echarts.init(this.$refs.chartContainer); } } } } </script> ``` ##### 3. 销毁时清理资源 ```javascript beforeUnmount() { if (this.chart) { this.chart.dispose(); // 销毁echarts实例 this.chart = null; } } ``` ##### 4. 元素存在性验证 ```javascript methods: { initLibrary() { const el = document.getElementById('target-element'); if (!el) { console.error('目标元素不存在'); return; } // 初始化逻辑... } } ``` --- ### 综合解决方案 结合两个错误的最佳实践: ```vue <template> <div v-show="hasData" ref="summaryTable"> <!-- 表格内容 --> </div> </template> <script> export default { data() { return { selectList: [], // 初始化为空数组 hasData: false } }, async mounted() { await this.loadData(); this.hasData = true; this.$nextTick(() => { if (this.$refs.summaryTable) { this.initTablePlugin(); // 安全初始化第三方插件 } }); }, methods: { async loadData() { try { this.selectList = await api.getData(); } catch (error) { console.error('数据加载失败', error); this.selectList = []; } }, calculateSummary() { return this.selectList.reduce((acc, item) => { // 安全的属性访问 const phenomenon = item?.defectsPmn ?? '未分类'; if (!acc[phenomenon]) { acc[phenomenon] = { /* 初始化 */ }; } // ...处理逻辑 return acc; }, {}); }, initTablePlugin() { // 使用ref而非直接DOM查询 const tableEl = this.$refs.summaryTable; if (tableEl) { new DataTable(tableEl); // 初始化表格插件 } } }, beforeUnmount() { // 清理资源 if (this.dataTable) this.dataTable.destroy(); } } </script> ``` --- ### 错误预防建议 1. **启用严格模式**:在 `vue.config.js` 中设置 `lintOnSave: true` 提前捕获潜在问题 2. **使用 TypeScript**:定义接口防止空值访问 ```typescript interface DefectItem { defectsPmn?: string; // 可选属性 ngQty: number; // ... } ``` 3. **单元测试覆盖**:添加边界情况测试 ```javascript // 测试用例:处理null值 test('calculateSummary handles null items', () => { const list = [null, { defectsPmn: '划伤', ngQty: 5 }]; expect(calculateSummary(list)).not.toThrow(); }); ``` 通过以上解决方案,可有效解决 `TypeError` `invalid dom` 错误,并提高代码健壮性[^1][^2][^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值