上一篇文章Vue比React好在哪里,这一篇作者则强调React还是比较Vue更好,Vue干预或给予的太多了,从而破坏了原生JS的优雅,虽然看起来提供了便利,实际却带来了麻烦。作为一个使用了React5年了的老程序员,自然更喜欢React,而不喜欢Vue的设计哲学。
好,下面看下作者对于Vue相比React来讲,究竟哪些地方不好。
1. 模板语法
Vue起家是一套模板引擎,有着一套自己的模板语法。但是像所有的模板语法一样,如Mustache.js, Handlebars, Lodash's template syntax, Django syntax等(译者注:JS模板语言至少50个以上,大家也至少都用过3种以上把),而每一个都有自己的语法规则,学习这些规则带来额外的代价,且这些模板很快消失,人们便会忘记。而React却不采用模板引擎的做法。
// React采用JSX语法来实现如下模板,基本上还是原生HTML与JS:
// React in
<div title="Hello">Message: {message}</div>;
// React out
React.createElement(div, { title: 'Hello' }, 'Message: ' + message);
With Vue.js I have no idea what the templates compile down to.
Vue是先看上述代码就得模板编译。Vue这种模板语言的写法,使得仅能访问部分的全局变量,还得牢记Vue模板语法,这增加了复杂度。
2. 指令
指令是Vue中杀手级的应用。然而,指令其实是一种API,指令很强大,也很灵活,有指令参数,可以有动态参数,有指令修饰符等。但这会带来额外的复杂度,需要牢记语法规则。虽然大多指令语法并不糟糕,但是v-for确非JS风格,更像是Python,这令人奇怪。
3. 组件
Vue是基于模板的框架,需要扩展组件来增强功能。而当使用自定义组件时,需要向Vue.js模板编译器告知所使用的组件。这导致了很多重复的代码,很啰嗦。如下:
// Import your components as you normally would with ES Modules
import ComponentA from './ComponentA';
import ComponentC from './ComponentC';
export default {
components: {
// Register them with the template compiler
ComponentA,
ComponentC,
},
// Then finally use them in your template
template: `
<ComponentA />
`,
};
4. 自定义事件
在React中都是一个组件对应一组属性。当希望React父子组件通信时,父组件可直接传递函数给子组件调用:
function Parent() {
const onClick = () => alert('hello!');
return <Child onClick={onClick} />;
}
function Child({ onClick }) {
return <button onClick={onClick}>Click me!</button>;
}
而在Vue中缺失这么写的:
const ParentComponent = {
components: { ChildComponent },
template: `<ChildComponent @greeting="alert('hello')" />`,
};
const ChildComponent = {
emits: ['greeting'],
template: `<button @click="$emit('greeting')">Click me!</button>`,
};
这可能会导致像Angular一样,事件与监听之间没有关联。虽然Vue使用了emits等工具来解决这个问题 ,但也可能存在Angular同样的问题 ,这点上并不如props传递的函数强大可靠。
5. 自定义事件句柄
Vue模板中引用方法时,会将函数名称作为字符串来传递,如下:
<button @click="greet">Greet</button>
使用字符串来传递函数很不优雅,虽然Vue工具会捕捉一些错误,但我不喜欢这种方式。
6. 响应式
Vue是数据双向绑定,视图或模型发生变化,会同时影响彼此。这虽然很灵活,但都需要拆包装之类,并且封装了底层实现 。对于原始值,Vue会自动解包复制,而对于引用对象则不会。而且在模板视图中数据模型会自动赋值,而在组件编写时却并不会。这都会造成一定的困惑。或许这是因为React里使用useState和useRef,仅返回setter函数和ref-object接口,这些API太简单了,它将大多数行为给到开发者。因此我会觉得Vue像魔术一样隐藏了一些东西,这可能并不是我想要的。
最后
我依然会选择React而不是Vue。可以我不喜欢Vue来替我做更多事情,而我更喜欢使用原始方法来完全控制我的界面(React刚好)。React并非没有替你做一些意向不到的事情,但至少一切都很清楚,而不像Vue。很难说React就一定更好,而是说跟适合我而已。这里只是把一些差异展现出来,供您参考。
接上篇:Vue相比React好在哪里? juejin.cn/post/688819…