Vue 2 和 Vue-Resource [无法读取 属性 'get' of undefined(…)]
Vue 2 and Vue-Resource [Cannot read property 'get' of undefined(…)]
最近使用 Broswerify 和 Vueify 升级到 Vue-2。在主应用程序中,我必须要求 vue/dist/vue.js
而不是 'vue',因为我没有使用 Webpack,但是现在当我使用 Vue.use(require('vue-resource'));
时,我得到 $http is undefined。 Vue1 这工作顺利。为了使它与 Vue-2 一起工作,我缺少什么?
错误:
Uncaught TypeError: Cannot read property 'get' of undefined(…)
Main.js:
require('./bootstrap');
var Vue = require('vue/dist/vue.js');
Vue.use(require('vue-resource'));
// var amazon = require('amazon-affiliate-api');
/**
* Next, we will create a fresh Vue application instance and attach it to
* the page. Then, you may begin adding components to this application
* or customize the JavaScript scaffolding to fit your unique needs.
*/
new Vue({
el: '#wrapper',
mounted: function () {
//use mounted instead of ready.
this.getHttp('/test', this.successFetch);
},
data: {
},
methods: {
successFetch: function (results) {
console.log(results);
},
//vue resource methods
getHttp: function (url,callback) {
const params = {
headers: {
'X-CSRF-TOKEN': this.token
}
}
this.$http.get(url, params).then(callback).catch(err => console.error(err));
},
Gulp.js:
const elixir = require('laravel-elixir');
require('laravel-elixir-vue-2');
require('browserify');
require('vueify');
elixir(function(mix){
mix.sass('main.scss')
.browserify('app.js');
});
Package.json:
{
"private": true,
"scripts": {
"prod": "gulp --production",
"dev": "gulp watch"
},
"devDependencies": {
"aliasify": "^2.1.0",
"bootstrap-sass": "^3.3.7",
"gulp": "^3.9.1",
"jquery": "^3.1.0",
"laravel-elixir": "^6.0.0-14",
"laravel-elixir-vue-2": "^0.2.0",
"laravel-elixir-webpack-official": "^1.0.2",
"lodash": "^4.16.2",
"vue": "^2.0.1",
"vue-resource": "^1.0.3",
"vueify": "^9.3.0"
},
"dependencies": {
"babel-preset-es2015": "^6.18.0",
"babel-preset-react": "^6.16.0",
"browserify": "^13.1.1"
}
}
如果您只是希望将此设置为 SPA(不一定使用 laravel),那么我建议您在构建项目时查看 vue-cli。
在 cli 中,您会发现一个简单且更高级的 browserify 设置。
如果搭建简单版本并添加vue-resource: npm install vue-resource -save--dev
然后您可以按如下方式调整 main.js 设置:
import Vue from 'vue'
import VueResource from 'vue-resource'
import App from './App.vue'
Vue.use(VueResource)
new Vue({
el: '#app',
render: h => h(App),
mounted () {
this.getHttp('/')
},
methods: {
getHttp (url) {
this.$http
.get(url)
.then(response => console.log(response))
.catch(err => console.error(err))
},
},
})
App 组件只是 cli 构建的默认组件
如果您正在为 laravel 构建,那么您在 Package.json 中有许多冗余模块,您可以考虑使用 laravel elixir vueify。 npmjs 上有一个 Vue 2.0 的分支(从未尝试过):
npm install laravel-elixir-vueify-2.0
我假设您遇到的问题是由于在构建 app.js
输出时需要 elixir 未使用的包。 laravel-elixir-vue-2
例如是一个 webpack 构建 - 所以可能什么都没做。
将您的 gulp 设置简化为:
var elixir = require('laravel-elixir');
require('laravel-elixir-vueify-2.0');
elixir(function(mix) {
mix.sass('main.scss')
.browserify('main.js');
});
理论上,您随后可以正确构建输出并使用 Vue 2.0 包来构建它。如果将其与上述 vue-cli 结合使用,您应该能够使用久经考验的代码搭建这些早期阶段的脚手架,从而使故障排除变得更加容易。
我修复了以下模式的这个问题:
npm install bootstrap-vue --save
npm install vue-resource --save
在main.js
import { Vue, i18n } from './bootstrap'
import BootstrapVue from 'bootstrap-vue'
Vue.use(BootstrapVue)
创建bootstrap.js
import Vue from 'vue'
import VueResource from 'vue-resource'
Vue.use(VueResource)
export { Vue }
在App.vue
this.$http.get('/api/module/all').then(...
最近使用 Broswerify 和 Vueify 升级到 Vue-2。在主应用程序中,我必须要求 vue/dist/vue.js
而不是 'vue',因为我没有使用 Webpack,但是现在当我使用 Vue.use(require('vue-resource'));
时,我得到 $http is undefined。 Vue1 这工作顺利。为了使它与 Vue-2 一起工作,我缺少什么?
错误:
Uncaught TypeError: Cannot read property 'get' of undefined(…)
Main.js:
require('./bootstrap');
var Vue = require('vue/dist/vue.js');
Vue.use(require('vue-resource'));
// var amazon = require('amazon-affiliate-api');
/**
* Next, we will create a fresh Vue application instance and attach it to
* the page. Then, you may begin adding components to this application
* or customize the JavaScript scaffolding to fit your unique needs.
*/
new Vue({
el: '#wrapper',
mounted: function () {
//use mounted instead of ready.
this.getHttp('/test', this.successFetch);
},
data: {
},
methods: {
successFetch: function (results) {
console.log(results);
},
//vue resource methods
getHttp: function (url,callback) {
const params = {
headers: {
'X-CSRF-TOKEN': this.token
}
}
this.$http.get(url, params).then(callback).catch(err => console.error(err));
},
Gulp.js:
const elixir = require('laravel-elixir');
require('laravel-elixir-vue-2');
require('browserify');
require('vueify');
elixir(function(mix){
mix.sass('main.scss')
.browserify('app.js');
});
Package.json:
{
"private": true,
"scripts": {
"prod": "gulp --production",
"dev": "gulp watch"
},
"devDependencies": {
"aliasify": "^2.1.0",
"bootstrap-sass": "^3.3.7",
"gulp": "^3.9.1",
"jquery": "^3.1.0",
"laravel-elixir": "^6.0.0-14",
"laravel-elixir-vue-2": "^0.2.0",
"laravel-elixir-webpack-official": "^1.0.2",
"lodash": "^4.16.2",
"vue": "^2.0.1",
"vue-resource": "^1.0.3",
"vueify": "^9.3.0"
},
"dependencies": {
"babel-preset-es2015": "^6.18.0",
"babel-preset-react": "^6.16.0",
"browserify": "^13.1.1"
}
}
如果您只是希望将此设置为 SPA(不一定使用 laravel),那么我建议您在构建项目时查看 vue-cli。
在 cli 中,您会发现一个简单且更高级的 browserify 设置。
如果搭建简单版本并添加vue-resource: npm install vue-resource -save--dev
然后您可以按如下方式调整 main.js 设置:
import Vue from 'vue'
import VueResource from 'vue-resource'
import App from './App.vue'
Vue.use(VueResource)
new Vue({
el: '#app',
render: h => h(App),
mounted () {
this.getHttp('/')
},
methods: {
getHttp (url) {
this.$http
.get(url)
.then(response => console.log(response))
.catch(err => console.error(err))
},
},
})
App 组件只是 cli 构建的默认组件
如果您正在为 laravel 构建,那么您在 Package.json 中有许多冗余模块,您可以考虑使用 laravel elixir vueify。 npmjs 上有一个 Vue 2.0 的分支(从未尝试过):
npm install laravel-elixir-vueify-2.0
我假设您遇到的问题是由于在构建 app.js
输出时需要 elixir 未使用的包。 laravel-elixir-vue-2
例如是一个 webpack 构建 - 所以可能什么都没做。
将您的 gulp 设置简化为:
var elixir = require('laravel-elixir');
require('laravel-elixir-vueify-2.0');
elixir(function(mix) {
mix.sass('main.scss')
.browserify('main.js');
});
理论上,您随后可以正确构建输出并使用 Vue 2.0 包来构建它。如果将其与上述 vue-cli 结合使用,您应该能够使用久经考验的代码搭建这些早期阶段的脚手架,从而使故障排除变得更加容易。
我修复了以下模式的这个问题:
npm install bootstrap-vue --save
npm install vue-resource --save
在main.js
import { Vue, i18n } from './bootstrap'
import BootstrapVue from 'bootstrap-vue'
Vue.use(BootstrapVue)
创建bootstrap.js
import Vue from 'vue'
import VueResource from 'vue-resource'
Vue.use(VueResource)
export { Vue }
在App.vue
this.$http.get('/api/module/all').then(...