Hai, Saya sedang melihat implementasi item menu saat ini dan memperhatikan bahwa tidak ada tautan yang sebenarnya (artinya, tag html <a>
). Akibatnya, misalnya, bahkan di bilah navigasi tidak ada tautan yang sebenarnya, dan transisi ke halaman lain dikelola melalui peristiwa onclick.
Saya pikir memiliki tautan akan menjadi peningkatan, terutama mengingat halaman yang dirender di sisi server.
Apakah menurut Anda ini masuk akal, atau apakah Anda memiliki alasan khusus untuk tidak pergi ke arah ini?
Aku bertanya-tanya tentang ini juga. Saya menggunakan rendering sisi server dalam aplikasi saya, ini adalah sesuatu yang harus diperhatikan.
Menggunakan elemen jangkar dengan atribut href
juga akan meningkatkan aksesibilitas dan memungkinkan orang untuk menggunakan perilaku browser yang biasa mereka gunakan (misalnya -Klik untuk membuka di tab baru).
+1
+1
+1
+1
+1
+1
+1
@ecesena apakah menurut Anda ini masih menjadi masalah dengan komponen MenuItem
? Lihat di sini . MenuItem
s dapat dikelilingi oleh <a>..</a>
, bukan?
ini mungkin dengan apa yang disarankan @shaurya947 .
Saya mencoba menggunakan MenuItems
di LeftNav saya seperti ini:
let menuItems = (
<div>
<MenuItem primaryText="Doors" leftIcon={<FontIcon className="material-icons" color={GlobalStyles.default.activeColor}>home</FontIcon>} /></a>
<MenuItem primaryText="Load" leftIcon={<FontIcon className="material-icons" color={GlobalStyles.default.activeColor}>home</FontIcon>} />
<MenuItem primaryText="Notes" leftIcon={<FontIcon className="material-icons" color={GlobalStyles.default.activeColor}>home</FontIcon>} />
<MenuItem primaryText="Alerts" leftIcon={<FontIcon className="material-icons" color={GlobalStyles.default.activeColor}>home</FontIcon>} />
<MenuItem primaryText="Admin" leftIcon={<FontIcon className="material-icons" color={GlobalStyles.default.activeColor}>home</FontIcon>} />
</div>
);
return (
<LeftNav
ref="leftNav"
docked={false}
onChange={this._onLeftNavChange}
>
{menuItems}
</LeftNav>
)
Membungkus <a>
sekitar tag <MenuItem>
memberikan peringatan validateDOMNesting(...): <a> cannot appear as a descendant of <a>. See MainLayout > a > ... > MenuItem > ListItem > EnhancedButton > a"
Jika Anda melakukan inspeksi Bereaksi pada output, Anda mendapatkan yang berikut.
<a href="/">
<MenuItem..>
<ListItem..>
<div>
<EnhancedButton..>
<a>
<TouchRipple ..>
</a>
</EnhancedButton>
</div>
</ListItem>
</MenuItem>
</a>
yang memiliki elemen <a>
bersarang adalah ofensif.
<MenuItems>
menghasilkan elemen <a>
dalam deklarasi Button. Prop apa yang digunakan dari MenuItem
untuk mengisi atribut href dalam <EnhancedButton>
dihasilkan?
Menggunakan objek MenuItem sebagai penyangga untuk LeftNav membuat tautan berfungsi, tetapi saya belum dapat menemukan cara menambahkan Ikon kiri/kanan dengan cara ini.
yaitu:
let menuItems = [
{ route: '/load_areas/'+ this.state.area + '/doors', text: 'Doors' },
{ route: '/load_areas/'+ this.state.area + '/trailer_loads', text: 'Load' },
{ route: 'notes', text: 'Notes' },
{ route: 'alerts', text: 'Alerts' },
{ route: 'admin', text: 'Admin' }
];
<LeftNav
ref="leftNav"
docked={false}
menuItems={menuItems}
onChange={this._onLeftNavChange}
/>
ini adalah masalah terpisah, silakan buka satu, sehingga kami dapat memberi label dan menambahkannya ke tonggak sejarah, tnx :grin:
Gunakan prop containerElement
!
melihat:
http://stackoverflow.com/questions/32106513/material-ui-menu-using-routes/34507786#34507786
<MenuItem
containerElement={<Link to="/profile" />}
primaryText="Profile"
leftIcon={
<FontIcon className="material-icons">people</FontIcon>
} />
Sekarang prop linkButton
dari EnhancedButton
tidak digunakan lagi. LinkButton tidak lagi diperlukan saat properti href
disediakan. Ini akan dihapus dengan v0.16.0.
Sebagai contoh:
<MenuItem primaryText="Primary Text" href="/your/link" />
href memuat ulang halaman. bagaimana jika saya ingin menggunakan router reaksi?
@cezarneaga coba href="#/your/link"
<MenuItem
containerElement={<Link to="/profile" />}
.../>
dokumentasi menyebutkan Anda harus memasukkan juga linkButton
. jika Anda menghapus ini, ini berfungsi tanpa kesalahan.
@DaxChen Saya melihat jawaban Anda yang diperbarui stackoverflow untuk Des 2016 (Sangat Terbaru haha) dan saya bertanya-tanya apakah Anda tahu apakah ini berfungsi untuk MenuItem di dalam Laci? Saya mencoba yang berikut di bawah ini dan sama sekali tidak dapat membuat Tautan berfungsi dengan MenuItem karena containerElement tampaknya tidak melakukan apa-apa.
<Drawer
docked={false}
width={300}
onRequestChange={this.closeDrawer}
open={this.state.open}>
<AppBar title="Title"
/>
<MenuItem primaryText="home" containerElement={<Link to="/home" />} />
</Drawer>
containerElement berfungsi tetapi tidak didokumentasikan, jadi saya kira utas ini harus berfungsi sebagai dokumentasi resmi untuk saat ini. Terima kasih!
Hai @Faolain !
Benar-benar minta maaf atas jawaban yang terlambat ...
Saya mencoba kode Anda pada aplikasi yang bersih dengan create-react-app
, tetapi semuanya tampak berfungsi dengan baik ?!
Mungkin Anda mengonfigurasi react-router
berbeda, atau apakah versinya berbeda?
Bagaimanapun, inilah Contoh Repo , dan Demo Langsung Di Sini .
Jika Anda masih tidak dapat menemukan penyebab masalah Anda, dapatkah Anda memberikan contoh repo untuk direproduksi?
Tidak ada solusi di atas yang berfungsi di Safari dan iOS. Jadi, inilah yang saya lakukan sebagai solusi untuk react-router
<MenuItem
onTouchTap={() => {
this._yourMethod()
browserHistory.push('/howItWorks')
}}
primaryText="Menu Link"
/>
@janzenz apakah contoh ini di sini tidak berfungsi di browser Anda?
Saya mencobanya di Safari di macOS dan Safari di iOS dan semuanya berfungsi. Apakah ini tidak bekerja untuk Anda?
Meskipun solusi Anda berhasil, ini dapat menyebabkan SEO yang buruk dan Anda akan kehilangan beberapa perilaku asli seperti pratinjau tautan dan klik opsi untuk membuka di tab baru.
@DaxChen terima kasih atas wawasannya. Saya tidak yakin apakah masalah saya terkait dengan tautan pertama Anda. Saya sudah mencoba yang ke-2 tetapi setelah saya menambahkan prop onTouchTap
<Link />
tidak berfungsi lagi.
@janzenz Saya telah menambahkan prop onTouchTap
dalam contoh saya sebelumnya dan masih berfungsi.
Tidak tahu apakah pengaturan Anda berbeda di suatu tempat atau sesuatu ...
Anda dapat memeriksa kode yang diperbarui dan melihat apakah itu berfungsi untuk Anda?
@DaxChen Saya melihat Anda menggunakan material-ui
pada versi ~0.16.0
. Sudahkah Anda mencoba ~0.17.0
dan melihat apakah itu masih tidak menjadi masalah?
@janzenz Saya menggunakan versi yang lebih lama, baru saja memperbarui ke 0.17.4
dan masih berfungsi!
Sentuh! Mungkin pengaturan saya saat itu. Terima kasih telah mengonfirmasi bahwa @DaxChen saya akan kembali ke utas ini jika saya telah menemukan masalah sebenarnya.
@DaxChen , saya mencoba contoh yang Anda berikan kepada saya, tetapi gagal
Uncaught Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in. Check the render method of `EnhancedButton`.
at invariant (invariant.js:44)
at ReactCompositeComponentWrapper.instantiateReactComponent [as _instantiateReactComponent] (instantiateReactComponent.js:74)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:367)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactDOMComponent.mountChildren (ReactMultiChild.js:238)
at ReactDOMComponent._createInitialChildren (ReactDOMComponent.js:697)
at ReactDOMComponent.mountComponent (ReactDOMComponent.js:516)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactDOMComponent.mountChildren (ReactMultiChild.js:238)
at ReactDOMComponent._createInitialChildren (ReactDOMComponent.js:697)
at ReactDOMComponent.mountComponent (ReactDOMComponent.js:516)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactDOMComponent.mountChildren (ReactMultiChild.js:238)
at ReactDOMComponent._createInitialChildren (ReactDOMComponent.js:697)
at ReactDOMComponent.mountComponent (ReactDOMComponent.js:516)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactDOMComponent.mountChildren (ReactMultiChild.js:238)
at ReactDOMComponent._createInitialChildren (ReactDOMComponent.js:697)
at ReactDOMComponent.mountComponent (ReactDOMComponent.js:516)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at ReactCompositeComponentWrapper.performInitialMount (ReactCompositeComponent.js:371)
at ReactCompositeComponentWrapper.mountComponent (ReactCompositeComponent.js:258)
at Object.mountComponent (ReactReconciler.js:46)
at mountComponentIntoNode (ReactMount.js:104)
at ReactReconcileTransaction.perform (Transaction.js:140)
at batchedMountComponentIntoNode (ReactMount.js:126)
at ReactDefaultBatchingStrategyTransaction.perform (Transaction.js:140)
at Object.batchedUpdates (ReactDefaultBatchingStrategy.js:62)
at Object.batchedUpdates (ReactUpdates.js:97)
at Object._renderNewRootComponent (ReactMount.js:320)
at Object._renderSubtreeIntoContainer (ReactMount.js:401)
at Object.render (ReactMount.js:422)
at Object.<anonymous> (index.js:36)
at __webpack_require__ (bootstrap e3e2367…:555)
at fn (bootstrap e3e2367…:86)
at Object.<anonymous> (bootstrap e3e2367…:578)
at __webpack_require__ (bootstrap e3e2367…:555)
at bootstrap e3e2367…:578
at bootstrap e3e2367…:578
Kode saya tersedia di https://github.com/hhimanshu/spicyveggie/tree/cards (cabang cards
)
Saya tidak yakin apa yang berbeda, tetapi itu tidak berfungsi
@janzenz
Saya juga mencoba browserHistory.push('/howItWorks')
dan mengimpor import browserHistory from 'react-router-dom'
, tetapi mendapat undefuned
.
@Oduig ,
Saya mencoba #/your/link
, tetapi tidak membawa saya kemana-mana
Saya mencoba /your/link
, tetapi memuat ulang halaman itu dan saya kehilangan Drawer
dari Material-UI
Tak satu pun dari hal-hal ini bekerja untuk saya. Kode saya tersedia di https://github.com/hhimanshu/spicyveggie/tree/cards (cabang cards
), komit khusus adalah https://github.com/hhimanshu/spicyveggie/commit/844b7b7cddf9102995cd2680a783df3b6ef48537 , Bisakah seseorang tolong bantu?
@hhimanshu ubah baris ini menjadi
import { Link } from 'react-router-dom'
@DaxChen , terima kasih. Itu saja. Namun, tidak ketika halaman saya dimuat dengan {<Link to="/menu"/>}
, itu memuat seluruh halaman dan Drawer
hilang.
@hhimanshu itu karena Anda hanya menggunakan komponen Menu
di \menu
route , jadi App
tidak akan dirender.
Sarangkan Menu
dan Summary
di dalam App
atau beberapa komponen tata letak, dan berikan turunan masing-masing.
Anda dapat menggunakan react-devtools untuk memeriksa hierarki komponen yang dirender dan statusnya!
Ini tidak terkait dengan material-ui, silakan baca lebih lanjut di tutorial/dokumen react-router.
Terima kasih @DaxChen , saya menyelesaikannya sebagai https://github.com/hhimanshu/spicyveggie/blob/master/src/index.js#L20
+1
Solusi untuk tautan yang DIDANGANI & TIDAK DITANGANI oleh React Router.
Jika tautan target ditangani oleh React Router
MenuItemLink.js
import React from 'react';
import { MenuItem } from 'material-ui/Menu';
import { Route } from 'react-router-dom';
class MenuItemLink extends React.Component {
render() {
const {
to, also,
...rest
} = this.props;
return (
<Route
render={({ history, location }) => (
<MenuItem
onClick={() => {
history.push(to);
if (typeof also === 'function') {
also();
}
}}
{...rest}
/>
)}
/>
);
}
}
MenuItemLink.muiName = 'MenuItem';
export default MenuItemLink;
Kode sampel:
import MenuItemLink from './MenuItemLink';
<Menu ... >
<MenuItemLink to="/users"
also={this.handleRequestClose}>Users</MenuItemLink>
</Menu>
Jika tautan target TIDAK ditangani oleh React Router, yaitu: permintaan diteruskan ke server API atau apa pun
fungsi onClick:
function facebookLoginRedirect () {
if (window) window.location.href = "/api/auth/facebook"
return true;
}
Kode sampel:
<MenuItem onClick={ facebookLoginRedirect }>Login with Facebook</MenuItem>
Saya datang untuk menambahkan ini, kalau-kalau ada orang lain yang menemukannya juga.
Pada v3.4, Anda dapat mencapai ini seperti:
import { Link } from 'react-router-dom';
import MenuItem from '@material-ui/core/MenuItem';
...
<MenuItem component={Link} to="/your-path">...</MenuItem>
Satu-satunya solusi yang berhasil bagi saya tanpa merusak tata letak Menu adalah:
```javascript
Satu-satunya solusi yang berhasil bagi saya tanpa merusak tata letak Menu adalah:
<MenuList> <Link to='/your-path' style={{ textDecoration: 'none' }}> <MenuItem> Notifications </MenuItem> </Link> <Link to='/your-path' style={{ textDecoration: 'none' }}> <MenuItem> Profile </MenuItem> </Link> </MenuList>
@eladlevy Ini akan berakhir dengan HTML semantik yang buruk.
<ul>
<a><li/></a>
<a><li/></a>
</ul>
Meninggalkan ini di sini jika itu membantu siapa pun (menjalankan v3.9.0). Saya membutuhkan <Select>
untuk bertindak sebagai menu react-router-dom
<Link>
s. Setiap tautan terkait dengan setelan bahasa, sehingga tarik-turun akan menampilkan nilai bahasa saat ini dari parameter kueri.
<Select value={currentLanguage}>
{languages.map(language => (
<ListItem
button
component={btnProps => (
<Link
to={ `/things?lang=${ language }` }
{...btnProps as any}
/>
)}
value={language}
key={language}
>
{language}
</ListItem>
))}
</Select>
Ini adalah solusi terbersih yang dapat saya temukan yang membutuhkan casting TypeScript minimal dan mempertahankan visual yang konsisten dengan Material UI.
@goyney punya solusinya, terima kasih
Saya datang untuk menambahkan ini, kalau-kalau ada orang lain yang menemukannya juga.
Pada v3.4, Anda dapat mencapai ini seperti:
import { Link } from 'react-router-dom'; import MenuItem from '@material-ui/core/MenuItem'; ... <MenuItem component={Link} to="/your-path">...</MenuItem>
Solusi yang berfungsi dan bersih, terima kasih ❤️
Untuk tautan eksternal, Anda ingin menggunakan component="a"
, tetapi juga mengelilingi MenuItem
di <li>
:
<MenuList>
<li>
<MenuItem
component="a"
href="https://google.com"
target="_blank"
>Google</MenuItem>
</li>
</MenuList>
Ini menghasilkan HTML berikut:
<ul class="MuiList-root MuiList-padding" role="menu" tabindex="-1">
<li>
<a class="[...]" tabindex="-1" aria-disabled="false" role="menuitem" href="https://google.com" target="_blank">Google</a>
</li>
</ul>
Misalkan saya memiliki menu popup dan menggunakan
import { Tautan } dari 'react-router-dom';
impor MenuItem dari '@material-ui/core/MenuItem';
\
Tautan akan memunculkan halaman / jalur Anda, bagaimana cara menutup menu popup?
Komentar yang paling membantu
Gunakan prop
containerElement
!melihat:
http://stackoverflow.com/questions/32106513/material-ui-menu-using-routes/34507786#34507786