• ref和reactive


    Vue

    ref

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

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

    1. <template>
    2. <div ref="myDiv">Hello, World!div>
    3. template>
    4. <script>
    5. export default {
    6. mounted() {
    7. const myDiv = this.$refs.myDiv;
    8. console.log(myDiv); // 输出
      Hello, World!
    9. // 改变内容
    10. myDiv.innerText = "Hello, Vue!";
    11. // 改变样式
    12. myDiv.style.color = "blue";
    13. }
    14. }
    15. script>

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

    1. <template>
    2. <div>{{ count.value }}div>
    3. <button @click="increment">Incrementbutton>
    4. template>
    5. <script>
    6. import { ref } from 'vue';
    7. export default {
    8. setup() {
    9. const count = ref(0);
    10. function increment() {
    11. count.value++;
    12. }
    13. return { count, increment };
    14. }
    15. }
    16. script>

    reactive

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

    1. <template>
    2. <div>{{ state.count }}div>
    3. <button @click="increment">Incrementbutton>
    4. template>
    5. <script>
    6. import { reactive } from 'vue';
    7. export default {
    8. setup() {
    9. const state = reactive({
    10. count: 0
    11. });
    12. function increment() {
    13. state.count++;
    14. }
    15. return { state, increment };
    16. }
    17. }
    18. script>

    vue中ref和reactive区别

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

    1. const user = ref({ name: 'John', age: 30 });
    2. console.log(user.value.name);

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

    1. const state = reactive({
    2. count: 0,
    3. user: {
    4. name: 'John',
    5. age: 30
    6. }
    7. });
    8. console.log(state.count,state.user.name);

    React

    ref

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

    函数组件

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

    1. import React, { useRef, useEffect } from 'react';
    2. function MyComponent() {
    3. const myDivRef = useRef(null);
    4. useEffect(() => {
    5. console.log(myDivRef.current); // 输出
      Hello, World!
    6. myDivRef.current.style.backgroundColor = 'yellow'; // 修改样式
    7. }, []);
    8. return <div ref={myDivRef}>Hello, World!div>;
    9. }

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

    1. import React, { useRef } from 'react';
    2. function Timer() {
    3. const count = useRef(0);
    4. const increment = () => {
    5. count.current++;
    6. console.log(count.current);
    7. };
    8. return <button onClick={increment}>Incrementbutton>;
    9. }

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

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

    类组件

    1、回调函数形式的ref

    1. import React, { Component } from 'react';
    2. class SearchComponent extends Component {
    3. handleSearch = () => {
    4. const keyword = this.keyWordElement.value;
    5. console.log('搜索关键词:', keyword);
    6. // 你可以在这里使用keyword进行搜索操作
    7. };
    8. render() {
    9. return (
    10. <div>
    11. <input
    12. ref={c => this.keyWordElement = c}
    13. type="text"
    14. placeholder="输入关键词点击搜索"
    15. />
    16. <button onClick={this.handleSearch}>搜索button>
    17. div>
    18. );
    19. }
    20. }
    21. export default SearchComponent;

    回调函数形式的ref

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

    2. React.createRef()

    1. import React, { Component } from 'react';
    2. class SearchComponent extends Component {
    3. constructor(props) {
    4. super(props);
    5. //创建ref
    6. this.keyWordElement = React.createRef();
    7. }
    8. handleSearch = () => {
    9. //访问ref:通过this.refName.current来访问DOM元素或组件实例
    10. const keyword = this.keyWordElement.current.value;
    11. };
    12. render() {
    13. return (
    14. <div>
    15. {*分配ref:在render方法中,将创建的ref对象赋值给JSX元素的ref属性*}
    16. <input
    17. ref={this.keyWordElement}
    18. type="text"
    19. placeholder="输入关键词点击搜索"
    20. />
    21. <button onClick={this.handleSearch}>搜索button>
    22. div>
    23. );
    24. }
    25. }
    26. export default SearchComponent;

    useState和useReducer代替reactive

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

    1. import React, { useState } from 'react';
    2. function Counter() {
    3. const [count, setCount] = useState(0);
    4. return (
    5. <div>
    6. <p>{count}p>
    7. <button onClick={() => setCount(count + 1)}>Incrementbutton>
    8. div>
    9. );
    10. }

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

    1. import React, { useReducer } from 'react';
    2. const initialState = { count: 0 };
    3. function reducer(state, action) {
    4. switch (action.type) {
    5. case 'increment':
    6. return { count: state.count + 1 };
    7. default:
    8. throw new Error();
    9. }
    10. }
    11. function Counter() {
    12. const [state, dispatch] = useReducer(reducer, initialState);
    13. return (
    14. <div>
    15. <p>{state.count}p>
    16. <button onClick={() => dispatch({ type: 'increment' })}>Incrementbutton>
    17. div>
    18. );
    19. }

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

    关注我,不迷路!!!

  • 相关阅读:
    MyBatis--获取参数和各种查询
    java ssm课题研究经费管理系统
    波浪input输入框文字边框动画
    IO流(IO Stream)
    .net异常处理
    FreeRTOS任务运行时间统计
    Linux系统ubuntu20.04 无人机PX4 开发环境搭建(失败率很低)
    Mysql事务隔离机制
    【OpenCV】仿 IOS 锁屏时钟
    Spring基础篇:MVC框架整合
  • 原文地址:https://blog.csdn.net/weixin_44921693/article/details/140373337