Skip to content

一文应对react与vue的对比

1.react 相对于 vue 的优势和对比

说一下我个人的理解,我觉得react和vue,不能说谁更好,两个框架都挺好的!但是react更加高级!

react 相对于 vue 的优势:

1.react 可以在 js 中直接把一些请求返回的,构造好的数据直接传递给组件,都是放在一起的,逻辑清晰更加简便,相对来说就是少了一些步骤,不需要通过一个html中间层去渲染这些数据!

vue 还要绑定到 data 中再通过 props 传递过去,当然还有一种思路就是使用 ref 去获取对象然后直接修改子组件的 data 值

2.react 生态更加完整,很多插件

3.react 可以实现一些高级功能:render props 这个技术可以实现动态渲染,vue 则比较难做到

4.还有一些性能优化:useCallback,useMemo这种钩子

vue的优势:上手比较容易,高度封装,有很多语法糖之类的,开发会相对更加快速!

2.render props

Render Props 是一种在 React 中共享代码逻辑的技术。它通过将一个函数**(函数里面有页面的模版内容)**作为组件的 prop 传递,并在组件内部调用该函数来共享逻辑。这个函数接收组件的内部状态或其他数据作为参数,并返回一个 React 元素或组件,以实现动态渲染。——> 相当于子到父的通信,只不过是直接通过子的数据构造并返回页面了(父组件直接使用子组件的数据生成模版的页面,不用再去用自定义事件触发),而不是接收子的数据再去构造页面

使用 Render Props,可以将通用的逻辑封装在一个函数中,并将该函数作为 prop 传递给其他组件,使得这些组件能够共享这个逻辑并使用它来渲染内容。这种模式使得组件之间的逻辑复用更加灵活。

以下是一个示例,演示了 Render Props 的使用:

jsx
import React from 'react';

// 定义一个使用 Render Props 的组件 ——> 子组件
class MouseTracker extends React.Component {
  // 组件内部状态
  state = { x: 0, y: 0 };

  // 更新鼠标位置的方法
  handleMouseMove = (event) => {
    this.setState({ x: event.clientX, y: event.clientY });
  };

  render() {
    return (
      <div style={{ height: '100vh' }} onMouseMove={this.handleMouseMove}>
        {/* 将 Render Props 函数作为 prop 传递给模版,动态生成内容(相当于动态插槽) */}
        {/*
          即动态的、可被赋值操作的:下面这个结构
          <div>
              <p>Mouse position: {mouse.x}, {mouse.y}</p>
          </div>
        */}
        {this.props.render(this.state)} {/*相当于子到父的通信,只不过是直接通过子的数据构造并返回页面了,而不是接收子的数据再去构造页面*/}
      </div>
    );
  }
}

// 使用 MouseTracker 组件,并传递 Render Props 函数 ——> 父组件
function App() {
  return (
    <div>
      <h1>Mouse Tracker</h1>
      <MouseTracker
        render={(mouse) => ( //这里直接用子传递的数据,构造页面
          <div>
            <p>Mouse position: {mouse.x}, {mouse.y}</p>
          </div>
        )}
      />
    </div>
  );
}

在上述示例中,我们定义了一个 MouseTracker 组件,它追踪鼠标的位置并将位置信息存储在组件的内部状态中。通过将一个 Render Props 函数作为 render prop 传递给 MouseTracker 组件,我们可以在 Render Props 函数中使用鼠标位置信息,并返回需要渲染的内容。

Render Props 提供了一种灵活的方式来实现组件之间的逻辑复用,使得代码更加可维护和可扩展。它在许多 React 库和组件中被广泛使用,如路由库 react-router 的 <Route> 组件就使用了 Render Props 模式来渲染匹配的路由。

如何向组件内部动态传入带内容的结构(标签)?

Vue中:
	使用slot技术, 也就是通过组件标签体传入结构  <A><B/></A>
React中:
	使用children props: 通过组件标签体传入结构
	使用render props: 通过组件标签属性传入结构,而且可以携带数据,一般用render函数属性
	这两个属性是每个组件都有的,他们的功能就类似于插槽

children props ——> 简单的传递内容的插槽

//这时我们在 C 组件,A 组件为子组件(给里面传入 B 组件)
<A>
  <B>xxxx</B>
</A>
A 组件:{this.props.children} //在 A 组件中取到 B 组件
B 组件:什么也干不了

问题: 如果B组件需要A组件内的数据, ==> 做不到

render props ——> 可以根据参数构建内容的插槽

//这时我们在 C 组件,A 组件为子组件(给里面传入 B 组件)
<A render={(data) => <B data={data}></B>}></A>
A组件: {this.props.render(内部state数据)} //调用 C 组件给传入的方法,给 B 组件传入自身的state,构建并取到 B 组件
B组件: 读取A组件传入的数据显示 {this.props.data} //使用 A 组件的数据进行一些操作

2.生态方面:react 构建样式化组件相对于普通的 css 的优势?

React 构建样式化组件相对于普通的 CSS 有几个优势:

  1. 组件化思维: React 的样式化组件鼓励开发者以组件化的方式构建用户界面。每个组件封装了自己的样式和行为,使代码更加模块化、可复用和易于维护。这种组件化思维使得开发者能够更好地管理和理解项目中的样式。
  2. 局部作用域: 在 React 中,样式通常是与组件绑定的,可以将样式限制在组件的作用域内。这样一来,不同组件间的样式不会互相干扰,避免了全局 CSS 的潜在冲突问题。这种局部作用域使得样式的管理更加可靠和可控。
  3. 组件状态响应: React 的样式可以与组件的状态和属性关联起来。通过使用状态或属性来控制样式,可以根据不同的应用场景或用户交互自动调整组件的样式,使得界面更加动态和交互式。
  4. 动态样式: 基于 React 的样式化组件可以使用 JavaScript 的逻辑来动态地生成样式,从而可以实现更加复杂的样式逻辑。这种灵活性可以让你根据条件或用户输入来动态调整组件的外观。
  5. 样式重用: React 的样式化组件鼓励样式的重用。你可以通过将样式作为 props 或类名传递给组件来实现不同样式的复用,这在构建类似但样式稍有差异的组件时特别有用。
  6. CSS-in-JS: React 生态系统中还涌现了一些 CSS-in-JS 库(例如 styled-components、Emotion 等),它们允许你在 JavaScript 文件中直接编写样式。这样做的优势是可以将样式与组件紧密结合,提供更加直观和灵活的样式管理方式。

然而,值得指出的是,React 构建样式化组件并不是完全取代普通 CSS 的选择。在某些情况下,使用传统的 CSS 仍然是合理和有效的,特别是对于简单的静态页面或全局样式。选择合适的样式化方式还要考虑具体项目的需求、规模和团队的熟悉程度。