栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > Web开发 > Vue.js

React.js和Vue.js的语法并列比较

Vue.js 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

React.js和Vue.js的语法并列比较

React.js和Vue.js都是很好的框架。而且Next.js和Nuxt.js甚至将它们带入了一个新的高度,这有助于我们以更少的配置和更好的可维护性来创建应用程序。但是,如果你必须经常在框架之间切换,在深入探讨另一个框架之后,你可能会轻易忘记另一个框架中的语法。在本文中,我总结了这些框架的基本语法和方案,然后并排列出。我希望这可以帮助我们尽快掌握语法,不过限于篇幅,这篇文章只比较React.js和Vue.js,下一篇再谈Next.js个Nuxt.js。

Github:https://github.com/oahehc/react-vue-comparison

Render

React.js


ReactDOM.render(, document.getElementById("root"));

Vue.js


new  Vue({

render: (h) => h(App),

}).$mount("#root");

基本组件 React.js

Class component


class MyReactComponent extends React.Component {

render() {

return 

Hello world

; } }

Function component


function  MyReactComponent() {

return 

Hello world

; }
Vue.js





Prop

React.js


function  MyReactComponent(props) {

const { name, mark } = props;

return 

Hello {name}{mark}

; } MyReactComponent.propTypes = { name: PropTypes.string.isRequired, mark: PropTypes.string, } MyReactComponent.defaultProps = { mark: '!', } ...

Vue.js






...



事件绑定 React.js

Class component


class MyReactComponent extends React.Component {

save  = () => {

console.log("save");

};

render() {

return ;

}

}

Function component


function  MyReactComponent() {

const  save  = () => {

console.log("save");

};

return ;

}

Vue.js





自定义事件

React.js


function  MyItem({ item, handleDelete }) {

return ;



}

...

function  App() {

const  handleDelete  = () => { ... }

return 

}

Vue.js






...





State React.js

Class component


class MyReactComponent extends React.Component {

state = {

name: 'world,

}

render() {

return 

Hello { this.state.name }

; } }

Function component


function  MyReactComponent() {

const [name, setName] = useState("world");

return 

Hello {name}

; }
Vue.js





Change-State React.js

Class component


class MyReactComponent extends React.Component {

state = {

count: 0,

};

increaseCount  = () => {

this.setState({ count: this.state.count +  1 });

// 在更新之前获取当前状态,以确保我们没有使用陈旧的值

// this.setState(currentState => ({ count: currentState.count + 1 }));

};

render() {

return (

>{this.state.count}
); } }

Function component


function  MyReactComponent() {

const [count, setCount] = useState(0);

const  increaseCount  = () => {

setCount(count  +  1);

// setCount(currentCount => currentCount + 1);

};

return (

>{count}
); }
Vue.js





双向绑定 (仅Vue.js) React.js

React没有双向绑定,因此我们需要自己处理数据流


function  MyReactComponent() {

const [content, setContent] = useState("");

return (

 setContent(e.target.value)}

/>

);

}

Vue.js





计算属性 React.js

React.js没有计算属性,但我们可以通过react hook轻松实现


function  DisplayName({ firstName, lastName }) {

const displayName = useMemo(() => {

return `${firstName} ${lastName}`;

}, [firstName, lastName]);

return 
{displayName}
; } ...
Vue.js





...



Watch React.js

React.js没有 watch 属性,但是我们可以通过react hook轻松实现


function  MyReactComponent() {

const [count, setCount] = useState(0);

const  increaseCount  = () => {

setCount((currentCount) =>  currentCount  +  1);

};

useEffect(() => {

localStorage.setItem("my_count", newCount);

}, [count]);

return (

>{count}
); }
Vue.js





Children-and-Slot

React.js


function  MyReactComponent({ children }) {

return 
{children}
; } ... Hello World

Vue.js






...

Hello World

渲染HTML

React.js


function  MyReactComponent() {

return 
...
" }} />; }

Vue.js






条件渲染

React.js


function  MyReactComponent() {

const [isLoading, setLoading] = useState(true);

return (

{isLoading && >Loading...} {isLoading ?
is loading
:
is loaded
}
); }

Vue.js






列表渲染

React.js


function  MyReactComponent({ items }) {

return (

    {items.map((item) => (
  • {item.name}: {item.desc}
  • ))}
); }

Vue.js






Render-Props

React.js


function  Modal({children, isOpen}) {

const [isModalOpen, toggleModalOpen] = useState(isOpen);

return (

{type children === 'function' ? children(toggleModalOpen) : children}
) ; } Modal.propTypes = { isOpen: PropTypes.bool, children: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired, } Modal.defaultProps = { isOpen: false, } ... {(toggleModalOpen) => {
...
}}

Vue.js(slot)






...







生命周期 React.js

Class component


class MyReactComponent extends React.Component {

static  getDerivedStateFromProps(props, state) {}

componentDidMount() {}

shouldComponentUpdate(nextProps, nextState) {}

getSnapshotBeforeUpdate(prevProps, prevState) {}

componentDidUpdate(prevProps, prevState) {}

componentWillUnmount() {}

render() {

return 
Hello World
; } }

Function component


function  MyReactComponent() {

// componentDidMount

useEffect(() => {}, []);

// componentDidUpdate + componentDidMount

useEffect(() => {});

// componentWillUnmount

useEffect(() => {

return () => {...}

}, []);

// 在渲染之后但在屏幕更新之前同步运行

useLayoutEffect(() => {}, []);

return 
Hello World
; }
Vue.js





错误处理

React.js


class ErrorBoundary extends React.Component {

state = { hasError: false };

static  getDerivedStateFromError(error) {

// 更新状态,这样下一个渲染将显示回退UI。

return { hasError: true };

}

componentDidCatch(error, errorInfo) {}

render() {

if (this.state.hasError) return 

Something went wrong.

; return this.props.children; } } ...

Vue.js


const vm =  new  Vue({

data: {

error: "",

},

errorCaptured: function(err, component, details) {

error = err.toString();

}

}

Ref React.js

Class component


class AutofocusInput extends React.Component {

constructor(props) {

super(props);

this.ref = React.createRef();

}

state = {

content: "",

};

componentDidMount() {

this.ref.current.focus();

}

setContent  = (e) => {

this.setState({ content: e.target.value });

};

render() {

return (



);

}

}

Function component


function  AutofocusInput() {

const [content, setContent] = useState("");

const ref = useRef(null);

useEffect(() => {

if (ref  && ref.current) {

ref.current.focus();

}

}, []);

return (

 setContent(e.target.value)}

/>

);

}

Vue.js





性能优化 React.js

PureComponent


class MyReactComponent extends React.PureComponent {

...

}

shouldComponentUpdate


class MyReactComponent extends React.Component {

shouldComponentUpdate(nextProps) {...}

...

}

React.memo


export  default React.memo(

MyReactComponent,

(prevProps, nextProps) => {

...

}

);

useMemo


export  default  function  MyReactComponent() {

return React.useMemo(() => {

return 
...
; }, []); }

useCallback


function  MyItem({ item, handleDelete }) {

const handleClick = useCallback(() => handleDelete(item), [

item,

handleDelete,

]);

return ;

}

Vue.js

v:once


v-once>This will never change: {{msg}}

函数式组件:我们可以将组件标记为 functional,这意味它无状态 (没有响应式数据),也没有实例 (没有 this 上下文)。






keep-alive 组件








完。


如果对你有所启发和帮助,可以点个关注、收藏、转发,也可以留言讨论,这是对作者的最大鼓励。

作者简介:Web前端工程师,全栈开发工程师、持续学习者。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号