vue babel-loader SyntaxError: Unexpected token on ":click" syntax
vue babel-loader SyntaxError: Unexpected token on ":click" syntax
我这样使用渲染函数:
.script.js
:
methods: {
handleClick(data){
console.log(data)
},
render(h, { node, data, store }) {
return (
<span>
<span>
<span>{node.label}</span>
</span>
<span style="float: right; margin-right: 20px">
<a href="javascript:;"
:attr="data.id" @click="handleClick">Edit{data.id}
</a>
</span>
</span>
);
}
}
但是 babel 遇到错误说 :click
有意外的标记。
.vue
:
<template src="./template.html"></template>
<script src="./script.js"></script>
package.json
:
"vue": "^2.2.6"
"vue-router": "^2.4.0"
"element-ui": "^1.2.8",
"babel-core": "^6.24.0",
"babel-loader": "^6.4.1",
"babel-plugin-transform-vue-jsx": "^3.4.2",
"vue-loader": "^11.3.4",
"webpack": "^2.3.1",
webpack
:
{
test: /\.vue$/,
loader: `vue-loader`,
options: {
loaders: {
js: 'babel-loader'
}
}
},
{
test: /\.js$/,
loader: `babel-loader`,
exclude: /(node_modules)/
}
.babelrc
:
{
"presets": [
["es2015", { "modules": false }], "stage-1", "stage-2", "stage-3"
],
"plugins": [
["transform-vue-jsx"],
["transform-object-assign"],
["component", [{
"libraryName": "element-ui",
"styleLibraryName": "theme-default"
}]]
]
}
当我运行gulp dist
时,babel抛出如下错误:
Namespaced tags/attributes are not supported. JSX is not XML.\nFor attributes like xlink:href, use xlinkHref instead.
正如@Bert Evans 所建议的,
在重新阅读 https://github.com/vuejs/babel-plugin-transform-vue-jsx 的自述文档后,我发现我只是在不理解 vue 特定 jsx 语法的语法的情况下编写代码。
正如文档所说:
Note that almost all built-in Vue directives are not supported when using JSX, the sole exception being v-show
, which can be used with the v-show={value}
syntax. In most cases there are obvious programmatic equivalents, for example v-if
is just a ternary expression, and v-for
is just an array.map()
expression, etc.
The equivalent of the above in Vue 2.0 JSX is:
render (h) {
return (
<div
// normal attributes or component props.
id="foo"
// DOM properties are prefixed with `domProps`
domPropsInnerHTML="bar"
// event listeners are prefixed with `on` or `nativeOn`
onClick={this.clickHandler}
nativeOnClick={this.nativeClickHandler}
// other special top-level properties
class={{ foo: true, bar: false }}
style={{ color: 'red', fontSize: '14px' }}
key="key"
ref="ref"
// assign the `ref` is used on elements/components with v-for
refInFor
slot="slot">
</div>
)
}
所以,我将代码更改为
render(h, {node,data,store}) {
const link = {
href: `/#/schema-type/${data.id}`
};
return (
<span>
<span>
<span>{node.label}</span>
</span>
<span>
<a href={link.href} target="_blank">edit</a>
</span>
</span>
);
}
而且有效!
尝试将您的 html 写成字符串:
Vue.component('my-component', {
template: '<div>A custom component!</div>'
});
看起来你习惯了React,但是写的有点不一样
我这样使用渲染函数:
.script.js
:
methods: {
handleClick(data){
console.log(data)
},
render(h, { node, data, store }) {
return (
<span>
<span>
<span>{node.label}</span>
</span>
<span style="float: right; margin-right: 20px">
<a href="javascript:;"
:attr="data.id" @click="handleClick">Edit{data.id}
</a>
</span>
</span>
);
}
}
但是 babel 遇到错误说 :click
有意外的标记。
.vue
:
<template src="./template.html"></template>
<script src="./script.js"></script>
package.json
:
"vue": "^2.2.6"
"vue-router": "^2.4.0"
"element-ui": "^1.2.8",
"babel-core": "^6.24.0",
"babel-loader": "^6.4.1",
"babel-plugin-transform-vue-jsx": "^3.4.2",
"vue-loader": "^11.3.4",
"webpack": "^2.3.1",
webpack
:
{
test: /\.vue$/,
loader: `vue-loader`,
options: {
loaders: {
js: 'babel-loader'
}
}
},
{
test: /\.js$/,
loader: `babel-loader`,
exclude: /(node_modules)/
}
.babelrc
:
{
"presets": [
["es2015", { "modules": false }], "stage-1", "stage-2", "stage-3"
],
"plugins": [
["transform-vue-jsx"],
["transform-object-assign"],
["component", [{
"libraryName": "element-ui",
"styleLibraryName": "theme-default"
}]]
]
}
当我运行gulp dist
时,babel抛出如下错误:
Namespaced tags/attributes are not supported. JSX is not XML.\nFor attributes like xlink:href, use xlinkHref instead.
正如@Bert Evans 所建议的, 在重新阅读 https://github.com/vuejs/babel-plugin-transform-vue-jsx 的自述文档后,我发现我只是在不理解 vue 特定 jsx 语法的语法的情况下编写代码。
正如文档所说:
Note that almost all built-in Vue directives are not supported when using JSX, the sole exception being
v-show
, which can be used with thev-show={value}
syntax. In most cases there are obvious programmatic equivalents, for examplev-if
is just a ternary expression, andv-for
is just anarray.map()
expression, etc.The equivalent of the above in Vue 2.0 JSX is:
render (h) {
return (
<div
// normal attributes or component props.
id="foo"
// DOM properties are prefixed with `domProps`
domPropsInnerHTML="bar"
// event listeners are prefixed with `on` or `nativeOn`
onClick={this.clickHandler}
nativeOnClick={this.nativeClickHandler}
// other special top-level properties
class={{ foo: true, bar: false }}
style={{ color: 'red', fontSize: '14px' }}
key="key"
ref="ref"
// assign the `ref` is used on elements/components with v-for
refInFor
slot="slot">
</div>
)
}
所以,我将代码更改为
render(h, {node,data,store}) {
const link = {
href: `/#/schema-type/${data.id}`
};
return (
<span>
<span>
<span>{node.label}</span>
</span>
<span>
<a href={link.href} target="_blank">edit</a>
</span>
</span>
);
}
而且有效!
尝试将您的 html 写成字符串:
Vue.component('my-component', {
template: '<div>A custom component!</div>'
});
看起来你习惯了React,但是写的有点不一样