Sıfırdan İleriye ReactJs yeni bir konusuna hoş geldiniz. Bugün yeni bir şeye geçiyoruz MUI veya tam adıyla Material UI ile tanışacağız. Aslında ReactJs ile öğreneceklerimiz temel olarak bu kadar şimdi bir React içinde kullanılan popüler CSS kütüphanelerinden biri olan Material UI göreceğiz. Aslında sadece direkt dokümantasyondan çeviri ve örnekler yapacağım. Dilerseniz kendiniz de aşağıdaki linkten resmi dokümantasyona ulaşabilirsiniz.
MUI sayesinde css ve tasarım işlerinde oldukça hız kazanacağız. MUI içerisinde 60 adet component mevcut hepsini tek tek açıklamak oldukça uzun olur bu yüzden en çok kullanılan component özelliklerini anlatacağım. İhtiyacınıza göre resmi dokümantasyonu açıp bakabilirsiniz.
Bugün Inputs componentlerine bakacağız. Inputların ne olduğunu hepimiz biliyoruz. Form alanlarında olsun, arama alanları olsun vb. her yerde sıkça kullandığımız bir özelliktir aslında. Bir önceki konuda login-register örnekleri yapmıştık orda bile inputlar ile oldukça kilit rol oynuyordu. Şimdi ilk olarak MUI nasıl kurulacağını bakalım.
Terminale gelip aşağdaki npm paketlerini yazalım.
Böylece mui içinde bulunan özellikleri projemize eklemiş olacağız. Şimdi ilk component olan inputlara geçiş yapalım.
Kod:
https://mui.com/
MUI sayesinde css ve tasarım işlerinde oldukça hız kazanacağız. MUI içerisinde 60 adet component mevcut hepsini tek tek açıklamak oldukça uzun olur bu yüzden en çok kullanılan component özelliklerini anlatacağım. İhtiyacınıza göre resmi dokümantasyonu açıp bakabilirsiniz.
Bugün Inputs componentlerine bakacağız. Inputların ne olduğunu hepimiz biliyoruz. Form alanlarında olsun, arama alanları olsun vb. her yerde sıkça kullandığımız bir özelliktir aslında. Bir önceki konuda login-register örnekleri yapmıştık orda bile inputlar ile oldukça kilit rol oynuyordu. Şimdi ilk olarak MUI nasıl kurulacağını bakalım.
Terminale gelip aşağdaki npm paketlerini yazalım.
Kod:
npm install @mui/material @emotion/react @emotion/styled
Kod:
npm install @mui/icons-material @mui/material @emotion/styled @emotion/react
Böylece mui içinde bulunan özellikleri projemize eklemiş olacağız. Şimdi ilk component olan inputlara geçiş yapalım.
Autocomplete
Autocomplete nerilen seçenekler paneliyle geliştirilmiş normal bir metin girişidir. Yani bir input alanı düşünün oraya daha yazmadan aşağıdaki seçenekler çıkıyor. Input alanına yazdıkça o seçenekler sizin seçeceğiniz değerler aynı olmaya çalışıyor. Mesela hangi ülkede olduğunuzu seçeceksiniz. Input alanına tıkladıktan sonra birçok ülke adı gelecek. Input alanına T yazdığımızda T ile başlayan ülkeler, Tü yazdığımızda Tü içeren ülkeler çıkacak. Hemen bir örnekle somutlaştıralım.
İlk olarak Top100Films diye bir dosya oluşturalım ve bir film objesi yaratalım.
Şimdi app.jsx dosyasında top100films import edelim. Ayrıca mui özelliklerinden textfield (input alanı) ve Autocomplete özelliğini tanımlayacağız.
İlk başta bize lazım olan componentleri import ettik daha sonra Autocomplete içinde disablePortal prop’u, bir bileşenin Portal kullanıp kullanmayacağını kontrol eder. Options kısmına oluşturduğumuz objeyi belirtiyoruz. RenderInput ile kullanıcıya bir arama kutusu sunarız ama bu kutuyu kendisi çizmez. Bunun yerine “benim iç input’umu nasıl göstereceğini sen belirle” der. Bunu da renderInput prop’u aracılığıyla yapar.
Görüldüğü üzere otomatik tamamlama işlemini yapabiliyoruz.
İlk olarak Top100Films diye bir dosya oluşturalım ve bir film objesi yaratalım.
JavaScript:
const top100Films = [
{ label: 'The Shawshank Redemption', year: 1994 },
{ label: 'The Godfather', year: 1972 },
{ label: 'The Godfather: Part II', year: 1974 },
{ label: 'The Dark Knight', year: 2008 },
{ label: '12 Angry Men', year: 1957 },
{ label: "Schindler's List", year: 1993 },
{ label: 'Pulp Fiction', year: 1994 },
{
label: 'The Lord of the Rings: The Return of the King',
year: 2003,
},
{ label: 'The Good, the Bad and the Ugly', year: 1966 },
{ label: 'Fight Club', year: 1999 },
{
label: 'The Lord of the Rings: The Fellowship of the Ring',
year: 2001,
},
{
label: 'Star Wars: Episode V - The Empire Strikes Back',
year: 1980,
},
{ label: 'Forrest Gump', year: 1994 },
{ label: 'Inception', year: 2010 },
{
label: 'The Lord of the Rings: The Two Towers',
year: 2002,
},
{ label: "One Flew Over the Cuckoo's Nest", year: 1975 },
{ label: 'Goodfellas', year: 1990 },
{ label: 'The Matrix', year: 1999 },
{ label: 'Seven Samurai', year: 1954 },
{
label: 'Star Wars: Episode IV - A New Hope',
year: 1977,
},
{ label: 'City of God', year: 2002 },
{ label: 'Se7en', year: 1995 },
{ label: 'The Silence of the Lambs', year: 1991 },
{ label: "It's a Wonderful Life", year: 1946 },
{ label: 'Life Is Beautiful', year: 1997 },
{ label: 'The Usual Suspects', year: 1995 },
{ label: 'Léon: The Professional', year: 1994 },
{ label: 'Spirited Away', year: 2001 },
{ label: 'Saving Private Ryan', year: 1998 },
{ label: 'Once Upon a Time in the West', year: 1968 },
{ label: 'American History X', year: 1998 },
{ label: 'Interstellar', year: 2014 },
{ label: 'Casablanca', year: 1942 },
{ label: 'City Lights', year: 1931 },
{ label: 'Psycho', year: 1960 },
{ label: 'The Green Mile', year: 1999 },
{ label: 'The Intouchables', year: 2011 },
{ label: 'Modern Times', year: 1936 },
{ label: 'Raiders of the Lost Ark', year: 1981 },
{ label: 'Rear Window', year: 1954 },
{ label: 'The Pianist', year: 2002 },
{ label: 'The Departed', year: 2006 },
{ label: 'Terminator 2: Judgment Day', year: 1991 },
{ label: 'Back to the Future', year: 1985 },
{ label: 'Whiplash', year: 2014 },
{ label: 'Gladiator', year: 2000 },
{ label: 'Memento', year: 2000 },
{ label: 'The Prestige', year: 2006 },
{ label: 'The Lion King', year: 1994 },
{ label: 'Apocalypse Now', year: 1979 },
{ label: 'Alien', year: 1979 },
{ label: 'Sunset Boulevard', year: 1950 },
{
label: 'Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb',
year: 1964,
},
{ label: 'The Great Dictator', year: 1940 },
{ label: 'Cinema Paradiso', year: 1988 },
{ label: 'The Lives of Others', year: 2006 },
{ label: 'Grave of the Fireflies', year: 1988 },
{ label: 'Paths of Glory', year: 1957 },
{ label: 'Django Unchained', year: 2012 },
{ label: 'The Shining', year: 1980 },
{ label: 'WALL·E', year: 2008 },
{ label: 'American Beauty', year: 1999 },
{ label: 'The Dark Knight Rises', year: 2012 },
{ label: 'Princess Mononoke', year: 1997 },
{ label: 'Aliens', year: 1986 },
{ label: 'Oldboy', year: 2003 },
{ label: 'Once Upon a Time in America', year: 1984 },
{ label: 'Witness for the Prosecution', year: 1957 },
{ label: 'Das Boot', year: 1981 },
{ label: 'Citizen Kane', year: 1941 },
{ label: 'North by Northwest', year: 1959 },
{ label: 'Vertigo', year: 1958 },
{
label: 'Star Wars: Episode VI - Return of the Jedi',
year: 1983,
},
{ label: 'Reservoir Dogs', year: 1992 },
{ label: 'Braveheart', year: 1995 },
{ label: 'M', year: 1931 },
{ label: 'Requiem for a Dream', year: 2000 },
{ label: 'Amélie', year: 2001 },
{ label: 'A Clockwork Orange', year: 1971 },
{ label: 'Like Stars on Earth', year: 2007 },
{ label: 'Taxi Driver', year: 1976 },
{ label: 'Lawrence of Arabia', year: 1962 },
{ label: 'Double Indemnity', year: 1944 },
{
label: 'Eternal Sunshine of the Spotless Mind',
year: 2004,
},
{ label: 'Amadeus', year: 1984 },
{ label: 'To Kill a Mockingbird', year: 1962 },
{ label: 'Toy Story 3', year: 2010 },
{ label: 'Logan', year: 2017 },
{ label: 'Full Metal Jacket', year: 1987 },
{ label: 'Dangal', year: 2016 },
{ label: 'The Sting', year: 1973 },
{ label: '2001: A Space Odyssey', year: 1968 },
{ label: "Singin' in the Rain", year: 1952 },
{ label: 'Toy Story', year: 1995 },
{ label: 'Bicycle Thieves', year: 1948 },
{ label: 'The Kid', year: 1921 },
{ label: 'Inglourious Basterds', year: 2009 },
{ label: 'Snatch', year: 2000 },
{ label: '3 Idiots', year: 2009 },
{ label: 'Monty Python and the Holy Grail', year: 1975 },
];
export default top100Films;
Şimdi app.jsx dosyasında top100films import edelim. Ayrıca mui özelliklerinden textfield (input alanı) ve Autocomplete özelliğini tanımlayacağız.
JavaScript:
import top100Films from "./Top100Film"
import TextField from '@mui/material/TextField';
import Autocomplete from '@mui/material/Autocomplete';
import './App.css'
function App() {
return (
<div className="app">
<Autocomplete
disablePortal
options={top100Films}
sx={{ width: 300 }}
renderInput={(params) => <TextField {...params} label="Movie" />}
/>
</div>
)
}
export default App
İlk başta bize lazım olan componentleri import ettik daha sonra Autocomplete içinde disablePortal prop’u, bir bileşenin Portal kullanıp kullanmayacağını kontrol eder. Options kısmına oluşturduğumuz objeyi belirtiyoruz. RenderInput ile kullanıcıya bir arama kutusu sunarız ama bu kutuyu kendisi çizmez. Bunun yerine “benim iç input’umu nasıl göstereceğini sen belirle” der. Bunu da renderInput prop’u aracılığıyla yapar.
Görüldüğü üzere otomatik tamamlama işlemini yapabiliyoruz.
Autocomplete ile Gruplama İşlemleri
Dilerseniz verilerimiz gruplara ayırarak kullanabiliriz. Objemize bakarsak yıl değeri var. Yıla göre verileri gruplayalım.
Burada options içinde top100Films objesini sort ile sıralıyoruz. Obje içinde year olduğu için a.year-b.year yaparak eskiden günümüze getirtiyoruz. Tam tersi için b.year-a.year yapmak yeterli olacaktır.
1994 yılına bakarsak filmler bakımından harika bir yıl olmuş.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
JavaScript:
import top100Films from "./Top100Film"
import TextField from '@mui/material/TextField';
import Autocomplete from '@mui/material/Autocomplete';
import './App.css'
function App() {
return (
<div className="app">
<Autocomplete
disablePortal
options={top100Films.sort((a, b) => a.year - b.year)}
groupBy={(film) => film.year}
sx={{ width: 300 }}
renderInput={(params) => <TextField {...params} label="Movie" />}
/>
</div>
)
}
export default App
Burada options içinde top100Films objesini sort ile sıralıyoruz. Obje içinde year olduğu için a.year-b.year yaparak eskiden günümüze getirtiyoruz. Tam tersi için b.year-a.year yapmak yeterli olacaktır.
1994 yılına bakarsak filmler bakımından harika bir yıl olmuş.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
Button
Button bildiğimiz butonların daha gelişmiş halidir. Dilerseniz kendi butonunuzu kullanabilirsiniz veya direkt buradan da alabilirsiniz.
Temelde 3 tür buton vardır. Köşeleri olmayan, köşeleri olan ve hem köşeleri olan hem içi dolu olandır.
Dilerseniz butonlara renk ile düzenleyerek daha farklı tasarımlar yapabilirsiniz.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
Temelde 3 tür buton vardır. Köşeleri olmayan, köşeleri olan ve hem köşeleri olan hem içi dolu olandır.
JavaScript:
import './App.css'
import Button from '@mui/material/Button';
function App() {
return (
<div className="app">
<Button variant="text">Text</Button>
<Button variant="contained">Contained</Button>
<Button variant="outlined">Outlined</Button>
</div>
)
}
export default App
Dilerseniz butonlara renk ile düzenleyerek daha farklı tasarımlar yapabilirsiniz.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
Button Group
Buton grupları, butonları gruplaştırmak için kullanılır. Bu component için az önce anlattığımız button özelliğini kullanmak zorundasınız.
Gördüğünüz üzere butonları gruplaştırma işlemlerinde kullanırız.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
JavaScript:
import './App.css'
import Button from '@mui/material/Button';
import ButtonGroup from '@mui/material/ButtonGroup';
function App() {
return (
<div className="app">
<ButtonGroup variant="contained" aria-label="Basic button group">
<Button>Bir</Button>
<Button>İki</Button>
<Button>Üç</Button>
<Button>Dör</Button>
<Button>Beş</Button>
</ButtonGroup>
</div>
)
}
export default App
Gördüğünüz üzere butonları gruplaştırma işlemlerinde kullanırız.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
Checkbox
Checkbox içi boş olan kullanıcı isterse bu içi boş olan kutulara tıklayınca tik işareti attığımız bir input elemanıdır.
JavaScript:
import Checkbox from '@mui/material/Checkbox';
import './App.css'
function App() {
return (
<div className="app">
<Checkbox defaultChecked />
<Checkbox />
<Checkbox disabled />
<Checkbox disabled checked />
</div>
)
}
export default App
Burada defaultChecked dersek tik işareti içinde olarak gelir. Hiçbir şey demezsek boş halde, disabled dersek tıklanamaz şekilde disabled checked ile de hem içi dolu hem tıklanamaz halde gelir.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
Radio Group
Radio Grup içi boş yuvarlık elemanlarını gruplamada kullanılır. Bunun için ayrıca Radio componentini ve FormControlLabel kullanmanız gerekmektedir.
Burada önce RadioGroup ile gruplama işlemi yapıyoruz daha sonra FormControl Label ile input elemanlarının labellarını düzenliyoruz. control içinde ise hangi input elamanı olacağını belirtiyoruz.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
JavaScript:
import './App.css'
import Radio from '@mui/material/Radio';
import RadioGroup from '@mui/material/RadioGroup';
import FormControlLabel from '@mui/material/FormControlLabel';
function App() {
return (
<div className="app">
<RadioGroup
aria-labelledby="gender-label"
defaultValue="female"
name="radio-buttons-group"
>
<FormControlLabel value="female" control={<Radio />} label="Female" />
<FormControlLabel value="male" control={<Radio />} label="Male" />
<FormControlLabel value="other" control={<Radio />} label="Other" />
</RadioGroup>
</div>
)
}
export default App
Burada önce RadioGroup ile gruplama işlemi yapıyoruz daha sonra FormControl Label ile input elemanlarının labellarını düzenliyoruz. control içinde ise hangi input elamanı olacağını belirtiyoruz.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
Rating
Özellikle E-ticaret sitelerinde bir ürünü puanlamak gibi yerlerde kullanılır.
Burada defaultValue ile ilk başta gelecek yıldız sayısını belirliyoruz. precision kısmında ise kaçar kaçar arttırabileceğimizi ayarlıyoruz.
Burada ise yıldız sayısına göre solda bir text belirtiyoruz.
labels adlı objemizde hangi yıldıza karşılık hangi yazı geleceğini belirtiyoruz. Daha sonra fonksiyon oluşturuyoruz. Bu fonksiyon ile değeri alıp texti yazdırıyoruz. Daha sonra value ve hover adlı iki hook tanımlıyoruz.
Rating componenti içine name, value (oluşturduğumuz hook) precision tanımlıyoruz. Daha sonra getLabelText ile oluşturduğumuz fonksiyonu buraya yazıyoruz. onChange işlemi ile kullanıcı her değiştirdiği değerde hooku yeni değerle güncelliyoruz. onChangeActive ile kullanıcı daha mouse üstüne getirince güncelleme işlemleri yapıyoruz.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
JavaScript:
import './App.css'
import Rating from '@mui/material/Rating';
function App() {
return (
<div className="app">
<Rating name="half-rating" defaultValue={2.5} precision={0.5} />
</div>
)
}
export default App
Burada defaultValue ile ilk başta gelecek yıldız sayısını belirliyoruz. precision kısmında ise kaçar kaçar arttırabileceğimizi ayarlıyoruz.
JavaScript:
import { useState } from 'react';
import './App.css'
import Rating from '@mui/material/Rating';
const labels = {
0.5: 'Useless',
1: 'Useless+',
1.5: 'Poor',
2: 'Poor+',
2.5: 'Ok',
3: 'Ok+',
3.5: 'Good',
4: 'Good+',
4.5: 'Excellent',
5: 'Excellent+',
};
function getLabelText(value) {
return `${value} Star${value !== 1 ? 's' : ''}, ${labels[value]}`;
}
function App() {
const [value, setValue] = useState(2);
const [hover, setHover] = useState(-1);
return (
<div className="app">
<Rating
name="hover-feedback"
value={value}
precision={0.5}
getLabelText={getLabelText}
onChange={(event, newValue) => {
setValue(newValue);
}}
onChangeActive={(event, newHover) => {
setHover(newHover);
}}
/>
{value !== null && (
<div style={{ marginTop: 10 }}>
{labels[hover !== -1 ? hover : value]}
</div>
)}
</div>
);
}
export default App;
Burada ise yıldız sayısına göre solda bir text belirtiyoruz.
labels adlı objemizde hangi yıldıza karşılık hangi yazı geleceğini belirtiyoruz. Daha sonra fonksiyon oluşturuyoruz. Bu fonksiyon ile değeri alıp texti yazdırıyoruz. Daha sonra value ve hover adlı iki hook tanımlıyoruz.
Rating componenti içine name, value (oluşturduğumuz hook) precision tanımlıyoruz. Daha sonra getLabelText ile oluşturduğumuz fonksiyonu buraya yazıyoruz. onChange işlemi ile kullanıcı her değiştirdiği değerde hooku yeni değerle güncelliyoruz. onChangeActive ile kullanıcı daha mouse üstüne getirince güncelleme işlemleri yapıyoruz.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
Select
Select, seçenekler listesinden kullanıcı tarafından sağlanan bilgileri toplamak için kullanılır.
Burada meslek hook tanımlıyoruz ve fonksiyon ile bu hook güncelliyoruz. Daha sonra FormControl ile bir form alanı oluşturup InputLabel ile input alanının başlığını giriyoruz. Select içinde value kısmına hazırladığımzı hook değerini, label ile placeholder belirtiyoruz. MenuItem ile input içinde olacak seçenekleri giriyoruz. Daha sonra seçtiğimiz değeri ekrana yazdırıyoruz.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
JavaScript:
import './App.css'
import InputLabel from '@mui/material/InputLabel';
import MenuItem from '@mui/material/MenuItem';
import FormControl from '@mui/material/FormControl';
import Select from '@mui/material/Select';
import { useState } from 'react';
function App() {
const [meslek, setMeslek] = useState('');
const handleChange = (event) => {
setMeslek(event.target.value);
};
return (
<div className="app">
<FormControl sx={{ width: 250 }}>
<InputLabel id="demo-simple-select-label">Mesleğiniz</InputLabel>
<Select
value={meslek}
label="Mesleğiniz"
onChange={handleChange}
>
<MenuItem value={"Yazılımcı"}>Yazılımcı</MenuItem>
<MenuItem value={"Siber Güvenlik Uzmanı"}>Siber Güvenlik Uzmanı</MenuItem>
<MenuItem value={"Diğer"}>Diğer</MenuItem>
</Select>
</FormControl>
<div className="meslek">
{meslek}
</div>
</div>
)
}
export default App
Burada meslek hook tanımlıyoruz ve fonksiyon ile bu hook güncelliyoruz. Daha sonra FormControl ile bir form alanı oluşturup InputLabel ile input alanının başlığını giriyoruz. Select içinde value kısmına hazırladığımzı hook değerini, label ile placeholder belirtiyoruz. MenuItem ile input içinde olacak seçenekleri giriyoruz. Daha sonra seçtiğimiz değeri ekrana yazdırıyoruz.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
Slider
Slider en çok gördüğümüz alan aslında video izlerkendir. Ses seviyesini azaltma-yükseltme işlemlerinde yapılır.
Burada gerekli componentleri import ettikten sonra ses seviyesi değerini tutmak için bir useState tanımlıyoruz ve bunu handleChange fonksiyonu ile güncelliyoruz. Daha sonra iconumuzu yerleştirip sliderimizi tanımlıyoruz. Burada value değeri tanımladığımız state ve onChange ise oluşturduğumuz fonksiyondur. Ek olarak Material UI elamanlarını kendi css ile düzenlemek için sx parametresiyle css kodları yazıyoruz. Genişliği %20 olarak tanımladım çünkü normal boyutu tüm sayfayı kaplıyordu.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
JavaScript:
import './App.css'
import Slider from '@mui/material/Slider';
import VolumeDownIcon from '@mui/icons-material/VolumeDown';
import VolumeUpIcon from '@mui/icons-material/VolumeUp';
import { useState } from 'react';
function App() {
const [value, setValue] = useState(30);
const handleChange = (event, newValue) => {
setValue(newValue);
};
return (
<div className="app">
<VolumeDownIcon />
<Slider aria-label="Volume" value={value} onChange={handleChange} sx={{ width: "20%" }} />
<VolumeUpIcon />
</div>
)
}
export default App
Burada gerekli componentleri import ettikten sonra ses seviyesi değerini tutmak için bir useState tanımlıyoruz ve bunu handleChange fonksiyonu ile güncelliyoruz. Daha sonra iconumuzu yerleştirip sliderimizi tanımlıyoruz. Burada value değeri tanımladığımız state ve onChange ise oluşturduğumuz fonksiyondur. Ek olarak Material UI elamanlarını kendi css ile düzenlemek için sx parametresiyle css kodları yazıyoruz. Genişliği %20 olarak tanımladım çünkü normal boyutu tüm sayfayı kaplıyordu.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
Switch
Switch, sağa ve sola doğru açıp-kapanan buton türüdür. Genelde dark mode - light mode tarzı işlemlerde kullanılır. Biz de bir dark mode - light mode örneği yapalım.
İlk olarak DarkMode adlı bir state oluşturduk bunu bir fonksiyonla değer değiştirme işlemi yaptık. Buraya kadar zaten biliyoruz şimdi şu ana kadar size göstermediğim şey eğer dilersek kendi css ile material ui elemanlarını değiştirebilmemizdir. CustomSwitch adlı değişkenmize styled(Switch)(({ theme }) dedik yani Switch tasarımı ile oynayacağımızı belirttik ve theme childreni belirttik. Bazı durumlarda bu props kullanılır.
Material UI içindeki elemanlarının csslerini değiştirdik. Bu elemanlar dokümantasyonda yer alıyor bunları kendi kafama göre yazmadım. CustomSwitch sonrası if-else ile kontrol ediyoruz eğer state true ise dark mode false ise light mode çalışacak.
Son olarak CustomSwitch içinde checked değerine darkMode, onChange değerine ise kontrol eden fonksiyonumuzu yazıyoruz.
Eğer kendi Switch'imizi yapmasaydık normalde <Switch checked = {darkMode}/> tarzı kullanacaktık ama biz bu Switch'i, bu componenti alıp kendimiz özelleştirdik ve adını değiştirdik.
Bu da demek oluyor ki Boostrap gibi bize dayatılanı değil eğer istersek kendi özelleştirmelerimizi de Material UI ile yapabiliriz.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
JavaScript:
import './App.css'
import Switch from '@mui/material/Switch';
import { useState } from 'react';
import { styled } from '@mui/material/styles';
function App() {
const [darkMode, setDarkMode] = useState(false);
const handleChangeMod = () => {
setDarkMode(!darkMode);
}
const CustomSwitch = styled(Switch)(({ theme }) => ({
width: 100,
height: 34,
padding: 7,
"& .MuiSwitch-switchBase": {
margin: 1,
padding: 0,
transform: "translateX(6px)",
"&.Mui-checked": {
color: "#fff",
transform: "translateX(65px)",
"& + .MuiSwitch-track": {
backgroundColor: darkMode ? "#555" : "#aab4be",
opacity: 1,
},
},
},
"& .MuiSwitch-thumb": {
backgroundColor: darkMode ? "#222" : "#fff",
width: 32,
height: 32,
"&:before": {
content: `"${darkMode ? '🌞' : '🌙'}"`,
position: "absolute",
width: "100%",
height: "100%",
left: 0,
top: 0,
display: "flex",
alignItems: "center",
justifyContent: "center",
fontSize: 18,
},
},
"& .MuiSwitch-track": {
borderRadius: 20 / 2,
backgroundColor: darkMode ? "#555" : "#aab4be",
opacity: 1,
},
}));
document.body.style.backgroundColor = darkMode ? "#222" : "white";
return (
<div className="app">
<CustomSwitch
checked={darkMode}
onChange={handleChangeMod}
/>
</div>
)
}
export default App
İlk olarak DarkMode adlı bir state oluşturduk bunu bir fonksiyonla değer değiştirme işlemi yaptık. Buraya kadar zaten biliyoruz şimdi şu ana kadar size göstermediğim şey eğer dilersek kendi css ile material ui elemanlarını değiştirebilmemizdir. CustomSwitch adlı değişkenmize styled(Switch)(({ theme }) dedik yani Switch tasarımı ile oynayacağımızı belirttik ve theme childreni belirttik. Bazı durumlarda bu props kullanılır.
Material UI içindeki elemanlarının csslerini değiştirdik. Bu elemanlar dokümantasyonda yer alıyor bunları kendi kafama göre yazmadım. CustomSwitch sonrası if-else ile kontrol ediyoruz eğer state true ise dark mode false ise light mode çalışacak.
Son olarak CustomSwitch içinde checked değerine darkMode, onChange değerine ise kontrol eden fonksiyonumuzu yazıyoruz.
Eğer kendi Switch'imizi yapmasaydık normalde <Switch checked = {darkMode}/> tarzı kullanacaktık ama biz bu Switch'i, bu componenti alıp kendimiz özelleştirdik ve adını değiştirdik.
Bu da demek oluyor ki Boostrap gibi bize dayatılanı değil eğer istersek kendi özelleştirmelerimizi de Material UI ile yapabiliriz.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
Text Field
Text Field aslında konunun en başında kullandık. Kendisi basit bir input alanı oluyor. Dilerseniz iconlar ile de kullanabilirsiniz. Şimdi basit bir login yapalım.
Burada hem textfield hem de bugün öğrendiğimiz button özelliğini gördük. Diğer form componentlerini InputAdornment istemeden de öğrendik ama tekrar ileride değineceğiz. Bu tarz ui kütüphanelerinde her şey birbirleriyle bağlantılıdır. Bir şey öğrenirken istemeden diğer özelliği de öğreniriz.
Burada stateler tanımladık bunları fonksiyon ile ekrana yazdıracağız. TextField yazıp içlerini doldurduk burada sadece InputProps yabancı gelecektir size onu anlatalım.
InputProps bir component içinde kullandığımız proptur. Mesela TextField içinde icon kullandık. İcon burada bir proptur. startAdornment ile icon yerini belirtiyoruz. Start diyerek sağ, end diyerek sol gibi ayarlamalar yapabiliriz.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.
JavaScript:
import './App.css'
import PersonIcon from '@mui/icons-material/Person';
import InputAdornment from '@mui/material/InputAdornment';
import TextField from '@mui/material/TextField';
import PasswordIcon from '@mui/icons-material/Password';
import { useState } from 'react';
import Button from '@mui/material/Button';
function App() {
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
const [savedData, setSavedData] = useState(null);
const saveDatas = () => {
setSavedData(`Username: ${username}, Password: ${password}`);
}
return (
<div className="app">
<div className="form">
<TextField
label="Username"
variant="standard"
value={username}
onChange={(e) => setUsername(e.target.value)}
InputProps={{
startAdornment: (
<InputAdornment position="start">
<PersonIcon />
</InputAdornment>
),
}}
/>
<TextField
label="Password"
variant="standard"
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
InputProps={{
startAdornment: (
<InputAdornment position="start">
<PasswordIcon />
</InputAdornment>
),
}}
/>
<Button onClick={saveDatas} variant="contained" style={{ marginTop: '20px' }}>
Giriş Yap
</Button>
{savedData && <p>{savedData}</p>}
</div>
</div>
)
}
export default App
Burada hem textfield hem de bugün öğrendiğimiz button özelliğini gördük. Diğer form componentlerini InputAdornment istemeden de öğrendik ama tekrar ileride değineceğiz. Bu tarz ui kütüphanelerinde her şey birbirleriyle bağlantılıdır. Bir şey öğrenirken istemeden diğer özelliği de öğreniriz.
Burada stateler tanımladık bunları fonksiyon ile ekrana yazdıracağız. TextField yazıp içlerini doldurduk burada sadece InputProps yabancı gelecektir size onu anlatalım.
InputProps bir component içinde kullandığımız proptur. Mesela TextField içinde icon kullandık. İcon burada bir proptur. startAdornment ile icon yerini belirtiyoruz. Start diyerek sağ, end diyerek sol gibi ayarlamalar yapabiliriz.
Daha birçok özellik için resmi sayfayı ziyaret etmeyi unutmayın.



