এইচটিএমএল বোতামে একটি প্রতিক্রিয়া-রাউটার লিঙ্কটি মোড়ানো


108

প্রস্তাবিত পদ্ধতি ব্যবহার করে: এটি ফলাফল: বোতামের একটি লিঙ্ক , মন্তব্য লাইনের মধ্যে কোড

আমি ভাবছিলাম যে কোনও প্রতিক্রিয়া ব্যবহার করে কোনও এইচটিএমএল ট্যাগ Linkথেকে কোনও উপাদান মোড়ানোর কোনও উপায় আছে কিনা ।'react-router'button

আমার কাছে বর্তমানে Linkআমার অ্যাপ্লিকেশনটিতে পৃষ্ঠাগুলি নেভিগেট করার উপাদান রয়েছে তবে আমি সেই কার্যকারিতাটি আমার এইচটিএমএল বোতামে ম্যাপ করতে চাই।

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

উত্তর:


165

এই একটি ওয়েব ব্রাউজারে রেন্ডার হবে, যে হুঁশিয়ার:
⚠️ একটি HTML পাখির buttonএকটি HTML এ a(অথবা বিপরীতভাবে) বৈধ HTML নয় ⚠️। আপনি যদি স্ক্রিন পাঠকদের কাছে আপনার এইচটিএমএল অর্থপূর্ণ রাখতে চান তবে অন্য একটি পদ্ধতির ব্যবহার করুন।

বিপরীত পথে মোড়ক করুন এবং আপনি লিঙ্কটি সংযুক্ত করে আসল বোতামটি পাবেন। কোনও সিএসএস পরিবর্তন দরকার নেই।

 <Link to="/dashboard">
     <button type="button">
          Click Me!
     </button>
 </Link>

এখানে বোতামটি এইচটিএমএল বোতাম। এটি তৃতীয় পক্ষের লাইব্রেরিগুলি যেমন সিনেম্যাটিক-ইউআই-প্রতিক্রিয়া থেকে আমদানিকৃত উপাদানগুলির ক্ষেত্রেও প্রযোজ্য ।

 import { Button } from 'semantic-ui-react'
 ... 
 <Link to="/dashboard">
     <Button style={myStyle}>
        <p>Click Me!</p>
     </Button>
 </Link>

4
ধন্যবাদ, সরল এবং কাজ করছে, যখন @ ফেজজেমস এর সিএসএস সলিউশন কাজ করছে না। সম্ভবত সেখানে কিছু অনুপস্থিত। তবে আমি বুটস্ট্র্যাপ ব্যবহার করছি; import { Button } from 'react-bootstrap';
স্টেফানো স্কর্পান্তি

4
নথির মাধ্যমে ট্যাব করার সময় আপনি অ্যাঙ্কারে এবং তারপরে আলাদাভাবে বোতামটিতে ট্যাব করবেন। এটি এড়াতে, লিঙ্ক উপাদানটিতে tabindex = "- 1" যুক্ত করুন। এন্টার টিপে বোতামটি সক্রিয় করা হলে লিঙ্কটি অনুসরণ করা হবে (কমপক্ষে ফায়ারফক্সে ...)।
কাঁপুনি

4
আপনি যেমন জানেন, লিঙ্কটি অ্যাঙ্কর ট্যাগ তৈরি করে <a href="">এবং অ্যাঙ্কার ট্যাগে বোতাম ট্যাগ থাকতে পারে না।
তাহের

4
এটি কাজ করে বলে মনে হচ্ছে, এটি শব্দার্থগতভাবে ভুল (এবং এইচটিএমএল 5 এ অবৈধ)। এইচটিএমএল 5 ব্যবহার করে আমি << বাটন> উপাদানকে <a> এর ভিতরে বাসা বাঁধতে পারি
imgx64

উদাহরণস্বরূপ আপনি যদি আপনার বোতামটি অক্ষম করে রাখেন তবে বোতামটি ক্লিক করা এখনও কাজ করবে। history.pushবিকল্পটির সাথে তুলনা করার সময় এই হ্যাকি সমাধানটি ব্যবহার করার সত্যিই কোনও কারণ নেই
বুড়াক

113

LinkButton উপাদান - প্রতিক্রিয়া রাউটার ভি 4 এর একটি সমাধান

প্রথমত, এই প্রশ্নের আরও অনেক উত্তর সম্পর্কে একটি নোট।

Est নেস্টিং <button>এবং <a>বৈধ এইচটিএমএল নয়। ⚠️

এখানে যে কোনও উত্তর যা buttonপ্রতিক্রিয়া রাউটার Linkউপাদান (বা তদ্বিপরীত) একটি এইচটিএমএল নীড় বাঁধার পরামর্শ দেয় একটি ওয়েব ব্রাউজারে রেন্ডার করে তবে এটি শব্দার্থ, অ্যাক্সেসযোগ্য বা বৈধ এইচটিএমএল নয়:

<a stuff-here><button>label text</button></a>
<button><a stuff-here>label text</a></button>

validator.w3.org সঙ্গে এই মার্কআপ যাচাই করতে ক্লিক করুন

বোতামগুলি সাধারণত লিঙ্কগুলির অভ্যন্তরে না রাখায় এটি লেআউট / স্টাইলিংয়ের সমস্যার দিকে নিয়ে যেতে পারে।


<button>প্রতিক্রিয়া রাউটার <Link>উপাদান সহ একটি এইচটিএমএল ট্যাগ ব্যবহার করা ।

আপনি যদি কেবল এইচটিএমএল buttonট্যাগ চান ...

<button>label text</button>

… তারপরে, এখানে একটি বোতামটি পাওয়ার জন্য সঠিক উপায় যা প্রতিক্রিয়া রাউটারের Linkউপাদানটির মতো কাজ করে ...

এই উপাদানগুলি আপনার উপাদানগুলিতে প্রেরণ করতে রাউটারের সাথে রাউটারের সাথে প্রতিক্রিয়া ব্যবহার করুন :

  • history
  • location
  • match
  • staticContext

LinkButton উপাদান

LinkButtonআপনার অনুলিপি / পাস্তা দেওয়ার জন্য এখানে একটি উপাদান রয়েছে :

// file: /components/LinkButton.jsx
import React from 'react'
import PropTypes from 'prop-types'
import { withRouter } from 'react-router'

const LinkButton = (props) => {
  const {
    history,
    location,
    match,
    staticContext,
    to,
    onClick,
    // ⬆ filtering out props that `button` doesn’t know what to do with.
    ...rest
  } = props
  return (
    <button
      {...rest} // `children` is just another prop!
      onClick={(event) => {
        onClick && onClick(event)
        history.push(to)
      }}
    />
  )
}

LinkButton.propTypes = {
  to: PropTypes.string.isRequired,
  children: PropTypes.node.isRequired
}

export default withRouter(LinkButton)

তারপরে উপাদানটি আমদানি করুন:

import LinkButton from '/components/LinkButton'

উপাদানটি ব্যবহার করুন:

<LinkButton to='/path/to/page'>Push My Buttons!</LinkButton>

আপনার যদি অনক্লিক পদ্ধতি প্রয়োজন হয়:

<LinkButton
  to='/path/to/page'
  onClick={(event) => {
    console.log('custom event here!', event)
  }}
>Push My Buttons!</LinkButton>

আপডেট: আপনি যদি উপরের লেখার পরে উপলভ্য অন্য মজাদার বিকল্পটি সন্ধান করছেন তবে এই ব্যবহারের রাউটার হুকটি দেখুন


13
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। অন্যান্য সমস্ত উত্তর হ'ল, আইএমএইচও, হ্যাক এবং অপ্রত্যাশিত ফলাফল সরবরাহ করতে পারে। ধন্যবাদ!
কাইল 18

ভিতরে উপাদান চলতে চলতে ব্যবহার হত <div> .. </divউপাদান App.js?
ডিজে 2

@ DJ2 - হ্যা, বা অন্য কোন উপাদান আপনি এটা ব্যবহার করতে চান।
মধ্যে Beau স্মিথ

এর জন্য ধন্যবাদ! আমার বিশেষ ব্যবহারের ক্ষেত্রে আমি একটি উপাদান-ইউআই বোতামটি আমদানি করেছিলাম import IconButton from '@material-ui/core/IconButton';এবং এর পরিবর্তে <button />এটি ব্যবহার করি এবং এটি দুর্দান্ত কাজ করে।
ড্যান ইভান্স

4
@ মেলোনেক - হ্যালো! যদি লক্ষ্যটি <a>এইচটিএমএল ট্যাগকে "বোতাম" এর মতো দেখতে দৃষ্টিবদ্ধ স্টাইলযুক্ত করে থাকে তবে হ্যাঁ @ চেসেজেমস সমাধান এটি অর্জন করে। উপরের প্রশ্নটি একটি <button>এইচটিএমএল উপাদান কীভাবে ব্যবহার করবেন তা জিজ্ঞাসা করে <a>
বীউ স্মিথ

37

কেন কেবল একটি বোতামের মতো একই CSS এর সাথে লিংক ট্যাগটি সাজাবেন না।

<Link 
 className="btn btn-pink"
 role="button"
 to="/"
 onClick={this.handleClick()}
> 
 Button1
</Link>

আমি এটিকে বেশিরভাগ ক্ষেত্রে একটি শেষ অবলম্বন হিসাবে রাখব কারণ আমার প্রয়োজনীয় সমস্ত বোতামের জন্য সিএসএস করেছি তবে পরামর্শের জন্য ধন্যবাদ
জোসে রিভেরা

উজ্জ্বল সমাধান। ব্লুপ্রিন্টের জন্য আমি এইভাবে করি: <লিঙ্ক ক্লাসেরনেম = {[ক্লাস.বুটটন, ক্লাসস.মিনিমাল, ক্লাসেস আইকন + "-" + আইকননাম.পিএলএস] .জাইন ("") oin থেকে = {"/ লিঙ্ক"}> লিঙ্ক </ লিংক>
ciiiycuk

13

আপনি যদি ব্যবহার করছেন react-router-domএবং material-uiআপনি ব্যবহার করতে পারেন ...

import { Link } from 'react-router-dom'
import Button from '@material-ui/core/Button';

<Button component={Link} to="/open-collective">
  Link
</Button>

আপনি এখানে আরও পড়তে পারেন ।


এই সমাধান টিএসের সাথে কাজ করবে না যেহেতু toপ্রপপ Linkবাধ্যতামূলক।
ডিরেক্টরি

এটি মনোমুগ্ধকর মতো কাজ করে, ধন্যবাদ
পেড্রো সিলভা

11

প্রতিক্রিয়া-রাউটার v5.1.0 থেকে আপনি useHistory হুক ব্যবহার করতে পারেন ।

useHistoryহুক আপনি ইতিহাস উদাহরণস্বরূপ অ্যাক্সেস আপনি নেভিগেট করতে ব্যবহার করতে পারেন আপনি।

import React from 'react'
import { useHistory } from 'react-router'

export default function SomeComponent() {
  const { push } = useHistory()
  ...
  <button
    type="button"
    onClick={() => push('/some-link')}
  >
    Some link
  </button>
  ...
}

আপনি কি "কোনও লিঙ্ক" ফাংশনটিতে ঠেলাতে পারেন?
রাশিনো

2020 এ এটি আমার পক্ষে কাজ করে না। UseHistory আমার প্রতিক্রিয়াটির সংস্করণটি বাতিল
বাইকম্যান 868

7

আমি রাউটার এবং <বাটন /> ব্যবহার করি। না <লিঙ্ক />

<Button onClick={()=> {this.props.history.replace('/mypage')}}>
   HERE
</Button>

4
আমি মনে করি এটি ডিফল্ট সমাধান হওয়া উচিত, তবে সম্ভবত কিছু বিবরণ আমার কাছে হারিয়ে গেছে? সমর্থনকারী যে কোনও উপাদান / নোড / উপাদান onClick={ () => navigateTo(somePath) }এই পদ্ধতির ব্যবহার করতে পারে। আপনার উত্তরের মতো রিডেক্স এবং import {push} from 'connected-react-router'কেবল history.push(বা প্রতিস্থাপন) ব্যবহার করুন Whether
থমাস ফাউসঙ্কেঞ্জার

6

4
সুতরাং আমি এটি চেষ্টা করেছি এবং আমি যা পেয়েছি তা হ'ল কেন্দ্রের একটি ছোট ক্লিকযোগ্য লিঙ্কযুক্ত একটি বোতাম যা এটির কার্য সম্পাদন করেছিল। তবে বোতামের অন্য কোথাও ক্লিক করলেও সরাসরি লিঙ্কটি কিছুই করতে পারেনি।
জোসে রিভেরা

আপনি বোতামটি স্টাইল করতে সিএসএস ব্যবহার করতে পারেন এটি সঠিক আকারের হয়েছে তা নিশ্চিত করতে। উদাহরণস্বরূপ, এটি সেট করা widthএবং height
রাফেল রাফাতপানঃ

4
আপনি বোতাম ট্যাগটির জন্য একইভাবে ইনলাইন শৈলীগুলি ব্যবহার করতে পারেন। অথবা আপনি অনেকগুলি "সিএসএসে জেএস" লাইব্রেরি ব্যবহার করতে পারেন। আমি পছন্দ styled-componentsgithub.com/styled-components/styled-components
রাফেল রাফাতপানাহ

4
এটি আপনার আপডেট হওয়া উত্তর নিয়ে কাজ করেছে। তোমাকে অনেক ধন্যবাদ!
জোসে রিভেরা

4
এটি সঠিক নয় ... আপনার লিঙ্কটি নয়, বোতামটি মোড়ানো উচিত 😱
বেনসাম্পাইও

6

প্রতিক্রিয়া 16.8+ ( হুকস ) এবং প্রতিক্রিয়া রাউটার 5 ব্যবহার করে যে কেউ সমাধান খুঁজছেন তাদের জন্য :

আপনি নিম্নলিখিত কোড সহ একটি বোতাম ব্যবহার করে রুটটি পরিবর্তন করতে পারেন:

<button onClick={() => props.history.push("path")}>

প্রতিক্রিয়া রাউটার আপনার উপাদানগুলিতে কিছু প্রপস সরবরাহ করে, ইতিহাসে পুশ () ফাংশন সহ যা <লিঙ্ক টু = 'পথ'> উপাদানটির মতো বেশ কাজ করে works

এই প্রপসগুলিতে অ্যাক্সেস পাওয়ার জন্য আপনার উপাদানগুলি উচ্চতর অর্ডার কম্পোনেন্ট "উইথ রউটার" দিয়ে মোড়ানোর দরকার নেই।


এটি আমার পক্ষে ভাল কাজ করে; যদিও আমি নিশ্চিত না যে এই সমাধানটি কী সম্পর্কে 16.8+ বা হুক প্রতিক্রিয়া জানাতে নির্দিষ্ট। আমি মনে করি আপনি এতক্ষণের সাথে এর BrowserRouterপরিবর্তে (HTML ইতিহাসের এপিআইয়ের উপর ভিত্তি করে) নিয়োগ দিচ্ছেন আপনি এটির সাথে ভাল আছেন HashRouter
প্লেজেন

3

স্টাইলযুক্ত উপাদানগুলির সাথে এটি সহজেই অর্জন করা যায়

প্রথমে স্টাইলযুক্ত বোতামটি ডিজাইন করুন

import styled from "styled-components";
import {Link} from "react-router-dom";

const Button = styled.button`
  background: white;
  color:red;
  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border: 2px solid red;
  border-radius: 3px;
`
render(
    <Button as={Link} to="/home"> Text Goes Here </Button>
);

আরও জন্য স্টাইলযুক্ত উপাদান এর বাড়িতে চেক করুন


3

প্রতিক্রিয়া রাউটার সংস্করণ 6 এর জন্য আপডেট:

এখানে বিভিন্ন উত্তরগুলি প্রতিক্রিয়া-রাউটারের বিবর্তনের সময়রেখার মতো 🙂

প্রতিক্রিয়া-রাউটার ভি 6 এর সর্বশেষতম হুক ব্যবহার করে, এটি এখন useNavigateহুক দিয়ে সহজেই করা যায় ।

import { useNavigate } from 'react-router-dom'      

function MyLinkButton() {
  const navigate = useNavigate()
  return (
      <button onClick={() => navigate("/home")}>
        Go Home
      </button>
  );
}

1

সমাধানগুলির মধ্যে অনেকগুলি জটিল বিষয়গুলিতে মনোনিবেশ করেছে।

উইথ রউটার ব্যবহার করা কোনও বোতামের মতো সাধারণ কোনও কিছুর জন্য একটি দীর্ঘ দীর্ঘ সমাধান যা অ্যাপের অন্য কোথাও লিঙ্ক করে।

আপনি যদি এসপিএ (একক পৃষ্ঠার অ্যাপ্লিকেশন) এর জন্য যাচ্ছেন তবে আমি সবচেয়ে সহজ উত্তরটি পেয়েছি বোতামের সমতুল্য শ্রেণীর নামটি ব্যবহার করা।

এটি নিশ্চিত করে যে আপনি নিজের সম্পূর্ণ অ্যাপ্লিকেশনটি পুনরায় লোড না করেই ভাগ করা রাষ্ট্র / প্রসঙ্গটি বজায় রেখেছেন

import { NavLink } from 'react-router-dom'; // 14.6K (gzipped: 5.2 K)

// Where link.{something} is the imported data
<NavLink className={`bx--btn bx--btn--primary ${link.className}`} to={link.href} activeClassName={'active'}>
    {link.label}
</NavLink>

// Simplified version:
<NavLink className={'bx--btn bx--btn--primary'} to={'/myLocalPath'}>
    Button without using withRouter
</NavLink>

এটি আমার পক্ষে কাজ করে না। বোতামের হোভ স্টাইলটি হারিয়ে গেছে v_v।
sbstnssndn

সম্ভবত আপনার হোভার শৈলীগুলি খুব বাধাজনক? তাদের কি বাটনে নিযুক্ত করা হয়েছে? MyClassName? স্টাইল নির্বাচনকারী থেকে বোতাম সরান। অথবা স্ক্যাসে এটি প্রসারিত করুন।
প্রেরণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.