ref和reactive

Vue

ref

在Vue 3中,ref有两个不同的用法:一个是用于模板中引用DOM元素或组件实例的ref属性,另一个是用于创建响应式数据的ref函数

1.DOM引用 :在模板中使用ref属性,随后可以在mounted生命周期钩子中访问DOM节点。(vue2和vue3都有)是一种直接在模板中使用的指令。

html 复制代码
<template>
  <div ref="myDiv">Hello, World!</div>
</template>

<script>
export default {
  mounted() {
    const myDiv = this.$refs.myDiv;
    console.log(myDiv); // 输出 <div>Hello, World!</div>

    // 改变内容
    myDiv.innerText = "Hello, Vue!";
    
    // 改变样式
    myDiv.style.color = "blue";
  }
}
</script>

响应式引用 :通过ref函数创建一个响应式引用,当其值变化时,视图会自动更新(vue3引入),是用于创建响应式数据的工具。

html 复制代码
<template>
  <div>{{ count.value }}</div>
  <button @click="increment">Increment</button>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const count = ref(0);
    
    function increment() {
      count.value++;
    }
    
    return { count, increment };
  }
}
</script>

reactive

reactive用于创建一个响应式对象。当对象的属性变化时,视图会自动更新。

html 复制代码
<template>
  <div>{{ state.count }}</div>
  <button @click="increment">Increment</button>
</template>

<script>
import { reactive } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0
    });
    
    function increment() {
      state.count++;
    }
    
    return { state, increment };
  }
}
</script>

vue中ref和reactive区别

ref用于创建一个单一的响应式值 。它可以是基本类型 (如数字、字符串)或对象, 基本类型需要通过**.value**访问和修改

javascript 复制代码
const user = ref({ name: 'John', age: 30 });
console.log(user.value.name);

reactive用于创建一个**深度响应式对象,**直接访问和修改属性

javascript 复制代码
const state = reactive({
  count: 0,
  user: {
    name: 'John',
    age: 30
  }
});
console.log(state.count,state.user.name);

React

ref

ref主要用于引用DOM元素或组件实例,通常使用useRef钩子来创建。它的主要用途是直接操作DOM元素,获取DOM节点或保持某些可变的值(这值的变化不会触发组件重新渲染)。

函数组件

1.创建和使用ref来引用DOM元素

javascript 复制代码
import React, { useRef, useEffect } from 'react';

function MyComponent() {
  const myDivRef = useRef(null);

  useEffect(() => {
    console.log(myDivRef.current); // 输出 <div>Hello, World!</div>
    myDivRef.current.style.backgroundColor = 'yellow'; // 修改样式
  }, []);

  return <div ref={myDivRef}>Hello, World!</div>;
}

2.保持不需要触发重新渲染的可变值

javascript 复制代码
import React, { useRef } from 'react';

function Timer() {
  const count = useRef(0);

  const increment = () => {
    count.current++;
    console.log(count.current);
  };

  return <button onClick={increment}>Increment</button>;
}

尽管useRef不会引发组件重新渲染,但它在处理以下情况时非常有用:

  • 引用和操作DOM元素。
  • 保持跨渲染周期的可变值,而不需要重新渲染组件。例如,保持计时器的ID,记录组件实例的一些信息,或在事件处理函数中使用。
  • 保存前一个渲染的值。
  • 避免闭包陷阱,在事件处理函数或异步函数中引用最新的值。

类组件

1、回调函数形式的ref

javascript 复制代码
import React, { Component } from 'react';

class SearchComponent extends Component {
  handleSearch = () => {
    const keyword = this.keyWordElement.value;
    console.log('搜索关键词:', keyword);
    // 你可以在这里使用keyword进行搜索操作
  };

  render() {
    return (
      <div>
        <input
          ref={c => this.keyWordElement = c}
          type="text"
          placeholder="输入关键词点击搜索"
        />
        <button onClick={this.handleSearch}>搜索</button>
      </div>
    );
  }
}

export default SearchComponent;

回调函数形式的ref

  • ref属性接受一个回调函数,该函数在组件挂载或更新时执行。回调函数会传递当前的DOM元素作为参数
  • c是当前的DOM元素。通过将c赋值给this.keyWordElement,你在组件实例上创建了一个引用,指向这个DOM元素。这样做的结果是,可以在类组件的其他方法中通过this.keyWordElement来访问和操作这个DOM元素。

2. React.createRef()

javascript 复制代码
import React, { Component } from 'react';

class SearchComponent extends Component {
  constructor(props) {
    super(props);
    //创建ref
    this.keyWordElement = React.createRef();
  }

  handleSearch = () => {
    //访问ref:通过this.refName.current来访问DOM元素或组件实例
    const keyword = this.keyWordElement.current.value;
  };

  render() {
    return (
      <div>
       {*分配ref:在render方法中,将创建的ref对象赋值给JSX元素的ref属性*}
        <input
          ref={this.keyWordElement}
          type="text"
          placeholder="输入关键词点击搜索"
        />
        <button onClick={this.handleSearch}>搜索</button>
      </div>
    );
  }
}
export default SearchComponent;

useState和useReducer代替reactive

useState:用于创建和管理组件的局部状态

javascript 复制代码
import React, { useState } from 'react';

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

  return (
    <div>
      <p>{count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

useReducer:用于管理复杂的状态逻辑,类似于Redux的reducer概念。

javascript 复制代码
import React, { useReducer } from 'react';

const initialState = { count: 0 };

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    default:
      throw new Error();
  }
}

function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <div>
      <p>{state.count}</p>
      <button onClick={() => dispatch({ type: 'increment' })}>Increment</button>
    </div>
  );
}

使用useStateuseReducer修改状态会触发组件重新渲染

关注我,不迷路!!!

相关推荐
dllmayday1 分钟前
Bootstrap三开关样式
前端·javascript·bootstrap
杨先生哦3 分钟前
【2026热端攻防系列 11/12】前端AI风控攻防实战:验证码缺陷、人机验证绕过、智能爬虫对抗与企业智能风控加固方案
前端·人工智能·笔记·爬虫·安全
CodeSheep4 分钟前
hvv员工家属爆料:老公22年入职的,普通员工,老是被误以为高薪多奖金,实际上还没配股,暂时钱没存多少,我倒是很心疼他工作辛苦。
前端·后端·程序员
IT_陈寒5 分钟前
Redis这个内存杀手坑惨了我,排查三小时发现是过期策略搞的鬼
前端·人工智能·后端
带娃的IT创业者35 分钟前
PostHog 的 TypeScript 原生移植:一场开源产品工程化的自我革命
javascript·typescript·开源·开源软件·posthog·技术重构
人间凡尔赛42 分钟前
React Compiler 正式落地一年:告别手动 useMemo/useCallback 的全栈实践
前端·性能优化·react
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2026-08-02
前端·神经网络·react.js·搜索引擎·前端框架
90后的晨仔11 小时前
从 H5 到 uni-app:一篇写给前端小白的"翻译指南"
前端·vue.js·前端框架
陈随易11 小时前
moon,apt和yum之外linux系统命令安装新选择
前端·后端·程序员
IT小盘12 小时前
13-企业Prompt模板-角色任务约束与输出格式
java·前端·prompt