You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/content/learn/reusing-logic-with-custom-hooks.md
+39-37Lines changed: 39 additions & 37 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -224,7 +224,7 @@ Bu isimlendirme kurallarına uymalısınız:
224
224
1.**React bileşenleri büyük harfle başlamalıdır,**`StatusBar` ve `SaveButton` gibi. React bileşenleri ayrıca, JSX gibi, React'in nasıl görüntüleyeceğini bildiği bir şey döndürmelidir.
225
225
2.**Hook isimleri `use` ile başlayıp büyük harfle devam etmelidir,**[`useState`](/reference/react/useState) (yerleşik) veya `useOnlineStatus` (özel, yukarıdaki örnekte olduğu gibi). Hook'lar keyfi değerler döndürebilir.
226
226
227
-
Bu kural, sizin bir bileşene her baktığınızda onun state, efektleri ve diğer React özelliklerinin nerede "saklanabileceğini" bilmenizi garanti eder. Örneğin, bileşeninizde `getColor()` fonksiyonu çağrısı görürseniz, adının `use` ile başlamadığı için içinde React state'i içeremeyeceğinden emin olabilirsiniz. Ancak, `useOnlineStatus()` gibi bir fonksiyon çağrısı büyük olasılıkla içinde başka Hook'lara çağrı içerecektir!
227
+
Bu kural, sizin bir bileşene her baktığınızda onun state, Efekt'leri ve diğer React özelliklerinin nerede "saklanabileceğini" bilmenizi garanti eder. Örneğin, bileşeninizde `getColor()` fonksiyonu çağrısı görürseniz, adının `use` ile başlamadığı için içinde React state'i içeremeyeceğinden emin olabilirsiniz. Ancak, `useOnlineStatus()` gibi bir fonksiyon çağrısı büyük olasılıkla içinde başka Hook'lara çağrı içerecektir!
228
228
229
229
<Note>
230
230
@@ -325,7 +325,7 @@ function SaveButton() {
325
325
}
326
326
```
327
327
328
-
Bunlar tamamen bağımsız iki state değişkenleri ve efektlerdir! Onlar rastlantısal olarak aynı anda aynı değere sahip oldular çünkü onları aynı harici değerle (ağın açık olup olmaması) senkronize ettiniz.
328
+
Bunlar tamamen bağımsız iki state değişkenleri ve Efekt'lerdir! Onlar rastlantısal olarak aynı anda aynı değere sahip oldular çünkü onları aynı harici değerle (ağın açık olup olmaması) senkronize ettiniz.
329
329
330
330
Bunu daha iyi canlandırabilmek adına, farklı bir örnek kullanacağız. Bu `Form` bileşenini ele alın:
331
331
@@ -599,9 +599,9 @@ button { margin-left: 10px; }
599
599
600
600
</Sandpack>
601
601
602
-
`serverUrl` ya da `roomId`'yi değiştirdiğinizde, efekt [değişikliklerinize "tepki verir"](/learn/lifecycle-of-reactive-effects#effects-react-to-reactive-values) ve yeniden senkronize olur. Konsol mesajlarından, efekt'in bağlı olduğu değerleri her değiştirdiğinizde sohbetin yeniden bağlandığını görebilirsiniz.
602
+
`serverUrl` ya da `roomId`'yi değiştirdiğinizde, Efekt [değişikliklerinize "tepki verir"](/learn/lifecycle-of-reactive-effects#effects-react-to-reactive-values) ve yeniden senkronize olur. Konsol mesajlarından, Efekt'in bağlı olduğu değerleri her değiştirdiğinizde sohbetin yeniden bağlandığını görebilirsiniz.
603
603
604
-
Şimdi efekt'in kodunu özel bir Hook'a taşıyın:
604
+
Şimdi Efekt'in kodunu özel bir Hook'a taşıyın:
605
605
606
606
```js {2-13}
607
607
export function useChatRoom({ serverUrl, roomId }) {
`ChatRoom` bileşeniniz her yeniden render edildiğinde, `roomId` ve `serverUrl`'in son hallerini Hook'unuza verir. Bu, bir yeniden render'dan sonra değerleri her değiştikten sonra Efekt'inizin sohbete yeniden bağlanmasının nedenidir. (Eğer önceden ses ya da video işleme yazılımı ile uğraştıysanız, Hook'ları bu şekilde zincirlemek size görsel ya da ses efektlerini zincirlemeyi hatırlatabilir. Adeta `useState`'in çıktısı `useChatRoom`'un girdisine "besleniyor" gibi.)
836
+
`ChatRoom` bileşeniniz her yeniden render edildiğinde, `roomId` ve `serverUrl`'in son hallerini Hook'unuza verir. Bu, bir yeniden render'dan sonra değerleri her değiştikten sonra Efekt'inizin sohbete yeniden bağlanmasının nedenidir. (Eğer önceden ses ya da video işleme yazılımı ile uğraştıysanız, Hook'ları bu şekilde zincirlemek size görsel ya da ses Efektlerini zincirlemeyi hatırlatabilir. Adeta `useState`'in çıktısı `useChatRoom`'un girdisine "besleniyor" gibi.)
837
837
838
838
### Olay yöneticilerini özel Hook'lara geçirme {/*passing-event-handlers-to-custom-hooks*/}
839
839
@@ -1411,9 +1411,9 @@ function SaveButton() {
1411
1411
1412
1412
Efektleri özel hook'lara sarmanın genellikle faydalı olmasının başka bir nedeni budur:
1413
1413
1414
-
1. Efektlerinizin içine ve efektlerinizden dışarı akan veriyi oldukça belirgin hale getirirsiniz.
1414
+
1. Efektlerinizin içine ve Efekt'lerinizden dışarı akan veriyi oldukça belirgin hale getirirsiniz.
1415
1415
2. Bileşenlerinizin, Efektlerinizin nasıl çalıştığından ziyade ne yapmak istediğine odaklanmasını sağlarsınız.
1416
-
3. React yeni özellikler eklediğinde, bu efektleri bileşenlerinizde herhangi bir değişiklik yapmadan kaldırabilirsiniz.
1416
+
3. React yeni özellikler eklediğinde, bu Efekt'leri bileşenlerinizde herhangi bir değişiklik yapmadan kaldırabilirsiniz.
1417
1417
1418
1418
Bir [tasarım sistemine](https://uxdesign.cc/everything-you-need-to-know-about-design-systems-54b109851969) benzer olarak, uygulamanızdaki bileşenlerde bulunan ortak kalıpları özel hook'lara çıkartmaya başlamayı faydalı bulabilirsiniz. Bu, bileşenlerinizin kodunu niyete odaklı tutar ve sık sık ham Efektler yazmaktan kaçınmanızı sağlar. Pek çok muazzam özel hook'lar React topluluğu tarafından sürdürülmektedir.
1419
1419
@@ -2068,9 +2068,9 @@ export function useCounter(delay) {
2068
2068
2069
2069
</Solution>
2070
2070
2071
-
#### Extract `useInterval` out of `useCounter` {/*extract-useinterval-out-of-usecounter*/}
Currently, your `useCounter` Hook does two things. It sets up an interval, and it also increments a state variable on every interval tick. Split out the logic that sets up the interval into a separate Hook called `useInterval`. It should take two arguments: the `onTick` callback, and the `delay`. After this change, your `useCounter`implementation should look like this:
2073
+
Şu an, `useCounter` Hook'unuz iki şey yapıyor, bir interval kuruyor ve aynı zamanda her interval tikinde bir state değişkenini artırıyor. Interval'i kuran mantığı `useInterval` adında ayrı bir Hook'a ayırın. Bu Hook, iki argüman almalıdır: `onTick` callback'i ve `delay`. Bu değişiklikten sonra, `useCounter`uygulamanız şu şekilde olmalıdır:
2074
2074
2075
2075
```js
2076
2076
exportfunctionuseCounter(delay) {
@@ -2082,7 +2082,7 @@ export function useCounter(delay) {
2082
2082
}
2083
2083
```
2084
2084
2085
-
Write `useInterval` in the `useInterval.js`file and import it into the `useCounter.js`file.
2085
+
`useInterval`'i `useInterval.js`dosyasının içine yazın ve onu `useCounter.js`dosyasında içe aktarın.
2086
2086
2087
2087
<Sandpack>
2088
2088
@@ -2092,7 +2092,7 @@ import { useCounter } from './useCounter.js';
2092
2092
2093
2093
exportdefaultfunctionCounter() {
2094
2094
constcount=useCounter(1000);
2095
-
return<h1>Seconds passed: {count}</h1>;
2095
+
return<h1>Geçen saniyeler: {count}</h1>;
2096
2096
}
2097
2097
```
2098
2098
@@ -2112,14 +2112,14 @@ export function useCounter(delay) {
2112
2112
```
2113
2113
2114
2114
```js src/useInterval.js
2115
-
//Write your Hook here!
2115
+
//Hook'unuzu bu dosyaya yazın!
2116
2116
```
2117
2117
2118
2118
</Sandpack>
2119
2119
2120
2120
<Solution>
2121
2121
2122
-
The logic inside `useInterval`should set up and clear the interval. It doesn't need to do anything else.
2122
+
`useInterval`içindeki mantık, interval'i kurmalı ve temizlemelidir. Başka bir şey yapmasına gerek yoktur.
2123
2123
2124
2124
<Sandpack>
2125
2125
@@ -2128,7 +2128,7 @@ import { useCounter } from './useCounter.js';
2128
2128
2129
2129
exportdefaultfunctionCounter() {
2130
2130
constcount=useCounter(1000);
2131
-
return<h1>Seconds passed: {count}</h1>;
2131
+
return<h1>Geçen saniyeler: {count}</h1>;
2132
2132
}
2133
2133
```
2134
2134
@@ -2158,36 +2158,38 @@ export function useInterval(onTick, delay) {
2158
2158
2159
2159
</Sandpack>
2160
2160
2161
-
Note that there is a bit of a problem with this solution, which you'll solve in the next challenge.
2161
+
Bu çözümde biraz bir sorun olduğuna dikkat edin, bunu bir sonraki bölümde çözeceksiniz.
2162
2162
2163
2163
</Solution>
2164
2164
2165
-
#### Fix a resetting interval {/*fix-a-resetting-interval*/}
In this example, there are *two* separate intervals.
2167
+
Bu örnekte, *iki* ayrı interval var.
2168
2168
2169
-
The `App`component calls `useCounter`, which calls `useInterval` to update the counter every second. But the `App`component *also* calls `useInterval` to randomly update the page background color every two seconds.
2169
+
`App`bileşeni `useCounter`'ı çağırıyor, o da sayacı her saniye arttırmak için `useInterval`'i çağırıyor. Ama `App`bileşeni *aynı zamanda* her iki saniyede bir sayfa arka plan rengini rastgele güncellemek için de `useInterval`'i çağırıyor.
2170
2170
2171
2171
For some reason, the callback that updates the page background never runs. Add some logs inside `useInterval`:
2172
2172
2173
+
Bir sebepten ötürü, sayfa arka planını güncelleyen callback hiç çalışmıyor. `useInterval` içerisine bazı loglar ekleyin:
2174
+
2173
2175
```js {2,5}
2174
2176
useEffect(() => {
2175
-
console.log('✅ Setting up an interval with delay', delay)
2177
+
console.log('✅ Delayli bir interval kuruluyor', delay)
2176
2178
constid=setInterval(onTick, delay);
2177
2179
return () => {
2178
-
console.log('❌ Clearing an interval with delay', delay)
2180
+
console.log('❌ Delayli bir interval temizleniyor', delay)
2179
2181
clearInterval(id);
2180
2182
};
2181
2183
}, [onTick, delay]);
2182
2184
```
2183
2185
2184
-
Do the logs match what you expect to happen? If some of your Effects seem to re-synchronize unnecessarily, can you guess which dependency is causing that to happen? Is there some way to [remove that dependency](/learn/removing-effect-dependencies) from your Effect?
2186
+
Log'lar olacağını düşündüğünüz şeyle uyuşuyor mu? Eğer bazı Efekt'leriniz gereksiz yere yeniden senkronize oluyorsa, bunun hangi dependency'den dolayı olduğunu tahmin edebilir misiniz? Efekt'inizden [bu dependency'yi kaldırabileceğiniz](/learn/removing-effect-dependencies) bir yol var mı?
2185
2187
2186
-
After you fix the issue, you should expect the page background to update every two seconds.
2188
+
Bu sorunu çözdükten sonra, sayfa arka planının her iki saniyede bir güncellendiğini görmelisiniz.
2187
2189
2188
2190
<Hint>
2189
2191
2190
-
It looks like your `useInterval` Hook accepts an event listener as an argument. Can you think of some way to wrap that event listener so that it doesn't need to be a dependency of your Effect?
2192
+
Görünen o ki `useInterval` Hook'unuz argüman olarak bir olay dinleyicisi alıyor. Bu olay dinleyicisini Efekt'iniz için bir dependency olmaya ihtiyaç duymadan nasıl sarabileceğinizi düşünebilir misiniz?
2191
2193
2192
2194
</Hint>
2193
2195
@@ -2221,7 +2223,7 @@ export default function Counter() {
2221
2223
document.body.style.backgroundColor= randomColor;
2222
2224
}, 2000);
2223
2225
2224
-
return<h1>Seconds passed: {count}</h1>;
2226
+
return<h1>Geçen saniyeler: {count}</h1>;
2225
2227
}
2226
2228
```
2227
2229
@@ -2256,11 +2258,11 @@ export function useInterval(onTick, delay) {
2256
2258
2257
2259
<Solution>
2258
2260
2259
-
Inside `useInterval`, wrap the tick callback into an Effect Event, as you did [earlier on this page.](/learn/reusing-logic-with-custom-hooks#passing-event-handlers-to-custom-hooks)
2261
+
`useInterval`'in içerisinde, tik callback'ini bir Efekt olayına [bu sayfada daha önce yaptığınız gibi](/learn/reusing-logic-with-custom-hooks#passing-event-handlers-to-custom-hooks) sarın
2260
2262
2261
-
This will allow you to omit `onTick` from dependencies of your Effect. The Effect won't re-synchronize on every re-render of the component, so the page background color change interval won't get reset every second before it has a chance to fire.
2263
+
Bu sizin `onTick`'i Efekt'iniz için bir dependency olmaktan çıkarmanıza olanak tanır. Efekt, bileşeniniz her yeniden renderlandığında tekrar senkronie olmayacak, böylece sayfa arka plan rengi değişim interval'i her saniye çalışmaya şans bulamadan sıfırlanmamış olacak.
2262
2264
2263
-
With this change, both intervals work as expected and don't interfere with each other:
2265
+
Bu değişiklikle birlikte, her iki interval de beklediğiniz gibi çalışır ve birbirleriyle etkileşime girmezler:
2264
2266
2265
2267
<Sandpack>
2266
2268
@@ -2327,21 +2329,21 @@ export function useInterval(callback, delay) {
2327
2329
2328
2330
</Solution>
2329
2331
2330
-
#### Implement a staggering movement {/*implement-a-staggering-movement*/}
2332
+
#### Gecikmelendirilmiş bir hareketi uygulayın {/*implement-a-staggered-movement*/}
2331
2333
2332
-
In this example, the `usePointerPosition()` Hook tracks the current pointer position. Try moving your cursor or your finger over the preview area and see the red dot follow your movement. Its position is saved in the `pos1`variable.
2334
+
Bu örnekte, `usePointerPosition()` Hook'u mevcut imleç konumunu takip eder. İmlecinizi veya parmağınızı önizleme alanı üzerinde hareket ettirmeyi deneyin ve kırmızı noktanın hareketinizi takip ettiğini görün. Noktanın konumu `pos1`değişkeninde saklanır.
2333
2335
2334
-
In fact, there are five (!) different red dots being rendered. You don't see them because currently they all appear at the same position. This is what you need to fix. What you want to implement instead is a "staggered" movement: each dot should "follow" the previous dot's path. For example, if you quickly move your cursor, the first dot should follow it immediately, the second dot should follow the first dot with a small delay, the third dot should follow the second dot, and so on.
2336
+
Aslında, render edilen beş (!) farklı kırmızı nokta var. Onları görmüyorsunuz çünkü şu anda hepsi aynı konumda görünüyor. Bu sorunu çözmeniz gerekiyor. Bunun yerine uygulamak istediğiniz şey "gecikmeli" bir hareket: her nokta bir önceki noktanın yolunu "takip" etmeli. Örneğin hızlıca imlecinizi hareket ettirirseniz, ilk nokta onu hemen takip etmeli, ikinci nokta ilk noktayı küçük bir gecikme ile takip etmeli, üçüncü nokta ikinci noktayı takip etmeli ve böyle devam etmeli.
2335
2337
2336
-
You need to implement the `useDelayedValue`custom Hook. Its current implementation returns the `value` provided to it. Instead, you want to return the value back from `delay` milliseconds ago. You might need some state and an Effect to do this.
2338
+
`useDelayedValue`özel Hook'unu yazmanız gerekiyor. Mevcut uygulama, ona sağlanan `value`'yu döndürmekte. Bunun yerine, `delay` kadar milisaniye önceki değeri döndürmek istemektesiniz. Bu işlemi yapmak için biraz state ve bir Efekt'e ihtiyacınız olabilir.
2337
2339
2338
-
After you implement `useDelayedValue`, you should see the dots move following one another.
2340
+
`useDelayedValue`'u yazdıktan sonra, noktaların birbirlerini takip ettiğini görmelisiniz.
2339
2341
2340
2342
<Hint>
2341
2343
2342
-
You'll need to store the `delayedValue` as a state variable inside your custom Hook. When the `value`changes, you'll want to run an Effect. This Effect should update`delayedValue` after the `delay`. You might find it helpful to call `setTimeout`.
2344
+
`delayedValue`'yu bir özel Hook'unuzun içinde bir state değişkeni olarak saklamanız gerekmekte. `value`değiştiğinde, bir Efekt çalıştırmak isteyeceksiniz. Bu Efekt, `delay`'den sonra`delayedValue`'yu güncellemelidir. `setTimeout`'u çağırmak size yardımcı olabilir.
2343
2345
2344
-
Does this Effect need cleanup? Why or why not?
2346
+
Bu Efekt'in cleanup'a ihtiyacı var mı? Varsa neden, yoksa neden?
2345
2347
2346
2348
</Hint>
2347
2349
@@ -2351,7 +2353,7 @@ Does this Effect need cleanup? Why or why not?
Here is a working version. You keep the `delayedValue` as a state variable. When `value`updates, your Effect schedules a timeout to update the`delayedValue`. This is why the `delayedValue` always "lags behind" the actual `value`.
2419
+
Burada çalışan bir versiyonu var. `delayedValue`'yu bir state değişkeni olarak saklıyorsunuz. `value`güncellendiğinde, Efekt'iniz `delayedValue`'yu güncellemek için bir timeout planlar. Bu yüzden`delayedValue` her zaman gerçek `value`'dan "geride kalır".
2418
2420
2419
2421
<Sandpack>
2420
2422
@@ -2491,7 +2493,7 @@ body { min-height: 300px; }
2491
2493
2492
2494
</Sandpack>
2493
2495
2494
-
Note that this Effect *does not* need cleanup. If you called`clearTimeout` in the cleanup function, then each time the `value`changes, it would reset the already scheduled timeout. To keep the movement continuous, you want all the timeouts to fire.
2496
+
Bu Efekt'in cleanup'a ihtiyacı *olmadığını* unutmayın. Eğer cleanup fonksiyonunda`clearTimeout`'u çağırdıysanız, o zaman her `value`değiştiğinde, zaten planlanmış olan timeout'u sıfırlar. Hareketi sürekli tutmak için, tüm timeout'ların çalışmasını istersiniz.
0 commit comments