موارد استفاده از ref

پرسیده شده
فعالیت 1011 روز پیش
دیده شده 429 بار
0

سلام وقت بخیر

ref چه جاهایی کاربرد دارد و چه جاهایی نباید از آن استفاده کرد؟

آیا ما میتوانیم ref برای کامپوننت ها استفاده کنیم و مثلا اگر ما کامپوننت Input داشته باشیم و بخواهیم ref را داخل کامپوننت بالا دست آن تعریف کنیم بهترین روش برای اینکه به Node داخل کامپوننت Input دسترسی داشته باشیم چیست؟

 

برای مثال اگر این کامپوننت های ما باشند:

// Input.jsx

export default function Input({ type, title, placeholder, ...rest }) {
    return (
        <input
            type={type}
            title={title}
            placeholder={placeholder}
            {...rest}
        />
    )
}
// Form.jsx

import { useEffect, useRef } from "react";
import useForm from "../../hooks/useForm";
import Input from "../Input";

export default function LoginForm() {
    const [username, setUsername] = useForm('');
    const [password, setPassword] = useForm('');
    const textInput = useRef(null);
    useEffect(() => {
        textInput.current?.focus();
    });

    return (

        <form>
            <Input
                title='username'
                placeholder='username'
                type='text'
                value={username}
                onChange={setUsername}
            />
            <Input
                title='password'
                placeholder='password'
                type='password'
                value={password}
                onChange={setPassword}
            />
            <button type="submit" className="btn">Login</button>
        </form>
    )
}

 

برای چنین فرم ساده ای روش بهینه استفاده از ref چیه؟

فایل پیوست

1
حذف شده

سلام

استفاده از ref محدود میشه به مدیریت focus, انتخاب متن,  , انیمیشن, media playback, ارتباط با کتابخانه های جانبی و به غیر از این موارد معمولا روش ها بهینه تر موجود هست

 

برای اینکه از طریق والد به کامپوننت فرزند از طریق ref دسترسی داشته باشیم بهتر که از forwardRef استفاده بکنیم که از این مورد خودت استفاده کردی

 

اساسا راه حل بهینه در یک شرایط واقعی معنا پیدا میکنه که آیا اون راه حل بهینه هست یا نه! برای این مورد هم چند روشی وجود داره

مثلا اگر قرار نیست به صورت داینامیک روی یک input عمیات focus انجام بشه میتونه خیلی راحت و ساده از autoFocus که از قابلیت های خود html استفاده بکنی و از طریق props هم میتونی اون رو کنترل بکنی

<input type="text" autoFocus />

اگرم بخوای به صورت داینامیک این مورد رو انجام بدی میتونی از ref استفاده بکنی که حالا اگر جاهای مختلف بخوای استفاده بکنی میتونی اون رو هم به یک custom hook تبدیل بکنی

 

بازم اگر جای ابهامی داری اعلام بکن که بیشتر صحبت بکنیم یا اگر برای نشوتن هر بخشی از اون مشکبی داشتی بگو که برات نمونه کد قرار بدم

 

فایل پیوست

مجتبی سوری

توسط

مجتبی سوری

31 تیر 00

0
حذف شده

من برای این مورد اینطور عمل کردم، به نظرتون راه حل اصولیه؟

// Input.jsx

import { forwardRef } from "react";

export default forwardRef(({ type, title, placeholder, ...rest }, ref) => {
    return (
        <input
            type={type}
            title={title}
            placeholder={placeholder}
            ref={ref}
            {...rest}
        />
    )
});
// Form.jsx

import { useEffect, useRef } from "react";
import useForm from "../../hooks/useForm";
import Input from "../Input";

export default function LoginForm() {
    const [username, setUsername] = useForm('');
    const [password, setPassword] = useForm('');
    const textInput = useRef(null);

    useEffect(() => {
        textInput?.current?.focus();
    }, []);

    return (

        <form>
            <Input
                title='username'
                placeholder='username'
                type='text'
                ref={textInput}
                value={username}
                onChange={setUsername}
            />
            <Input
                title='password'
                placeholder='password'
                type='password'
                value={password}
                onChange={setPassword}
            />
            <button type="submit" className="btn">Login</button>
        </form>
    )
}

 

فایل پیوست

محمد علی ناصری

توسط

محمد علی ناصری

31 تیر 00

جلسه useRef