Feliz: [<reactcomponent>] React refresh의 React.functionComponent λŒ€</reactcomponent>

에 λ§Œλ“  2020λ…„ 11μ›” 25일  Β·  10μ½”λ©˜νŠΈ  Β·  좜처: Zaid-Ajaj/Feliz

μ•ˆλ…• 친ꡬ,

μˆœμ§„ν•œ μ›Œλ„ˆλΉ„ ν”„λ‘ νŠΈ μ—”λ“œ κ°œλ°œμžλ‘œμ„œ μ €λŠ” ν₯미둜운 ν–‰λ™μ„ν–ˆμŠ΅λ‹ˆλ‹€.

더 λ‚˜μ€ 디버깅을 μœ„ν•΄ ꡬ성 μš”μ†Œ 이름을 지정할 μˆ˜λ„ μžˆμœΌλ―€λ‘œ λ¬Έμ„œλ₯Ό 기반으둜 React.functionComponent λ₯Ό μ‚¬μš©ν•˜μ—¬ ꡬ성 μš”μ†Œλ₯Ό λ§Œλ“œλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μž¬λ―ΈμžˆλŠ” 것은 리 μ•‘νŠΈ λ¦¬ν”„λ ˆμ‹œμ™€ ν•¨κ»˜ μ œκ³΅λ©λ‹ˆλ‹€.

이와 같은 μ½”λ“œλŠ” μ½”λ“œ λ³€κ²½μ‹œ 항상 전체 νŽ˜μ΄μ§€ λ‹€μ‹œλ‘œλ“œλ₯Ό νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€.

let subView = React.functionComponent("SubView", fun () ->
    Html.text "Hello from sub"
)

let topView = React.functionComponent("TopView", fun () ->
    Html.div [ Html.div "Hello from top"; subView () ]
)

image

κ·ΈλŸ¬λ‚˜ [<ReactComponent>] 루트 ꡬ성 μš”μ†Œκ°€ 있으면 전체 μƒˆλ‘œ 고침을 μˆ˜ν–‰ν•˜μ§€ μ•Šκ³ λ„ λͺ¨λ“  μƒˆλ‘œ 고침이 ν›Œλ₯­ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

let subView = React.functionComponent("SubView", fun () ->
    Html.text "Hello from sub"
)

[<ReactComponent>]
let topView () = Html.div [ Html.div "Hello from top"; subView () ]

λ²„κ·ΈμΈκ°€μš”? 멋진 검은 λ„₯타이 일λͺ… κΈ°λŠ₯의 λ²„κ·Έμž…λ‹ˆκΉŒ? ReactComponent 속성과 React.functionComponent ν•¨μˆ˜μ˜ 차이λ₯Ό 얻지 λͺ»ν•˜κΈ° λ•Œλ¬Έμ— λ‚΄ 잘λͺ»μž…λ‹ˆκΉŒ? πŸ˜„

이해λ₯Ό 돕기 μœ„ν•΄ 도움을 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

와! κ·Έλƒ₯ ... μ™€μš°! 어리석은 μ‚¬λžŒμ€ 어리석은 μ§ˆλ¬Έμ„ν•˜κ³  λ˜‘λ˜‘ν•œ μ‚¬λžŒμ€ κ΄€λ ¨ 정보와 μ„€λͺ…이 κ°€λ“ν•œ 3 μž₯의 A4 μš©μ§€λ‘œ λŒ€λ‹΅ν•©λ‹ˆλ‹€. 🀯 당신은 κ·Έλƒ₯ ν”λ“œλŠ”κ΅°μš”! κ°μ‚¬ν•©λ‹ˆλ‹€! ❀️ 이제 μ΄ν•΄ν•˜κ³  λŒ€μ‹  Attributeλ₯Ό μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€.

μ–΄λ–»κ²Œ λ“  ꡬ성 μš”μ†Œμ˜ 이름을 μ§€μ •ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆκΉŒ ( React.functionComponent 의 첫 번째 맀개 λ³€μˆ˜λ₯Ό μ‚¬μš©ν–ˆλ˜ κ²ƒμ²˜λŸΌ) μ•„λ‹ˆλ©΄ 속성 접근에 더 이상 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

λͺ¨λ“  10 λŒ“κΈ€

속성은 λ―Έλž˜μ— 갈 길이 될 것이며 λ°˜μ‘ μƒˆλ‘œ 고침이 μž‘λ™ν•˜λŠ” 데 ν•„μš”ν•©λ‹ˆλ‹€. 적어도 그게 κ·Έλž¬μ§€λ§Œ @ Zaid-Ajajκ°€ 차이가 없도둝 λΆ„λ₯˜ν–ˆλ‹€κ³  생각 ν–ˆμŠ΅λ‹ˆκΉŒ?

μ•ˆλ…•ν•˜μ„Έμš”λ‘œλ§Œ,

이것은 짧은 λŒ€λ‹΅μ΄μ—†λŠ” 정말 쒋은 μ§ˆλ¬Έμž…λ‹ˆλ‹€.

μ§‘μ—μ„œ 인터넷 문제λ₯Ό ν•΄κ²° ν•œ ν›„μ—λŠ” μŠ€νŠΈλ¦¬λ°μ„ λ‹€μ‹œ μ‹œμž‘ν•˜μ—¬ κ·Ήμ‹¬ν•œ μ„ΈλΆ€ μ‚¬ν•­μœΌλ‘œ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€ 😁

더 λ‚˜μ€ 디버깅을 μœ„ν•΄ ꡬ성 μš”μ†Œ 이름을 지정할 μˆ˜λ„ μžˆμœΌλ―€λ‘œ λ¬Έμ„œλ₯Ό 기반으둜 React.functionComponent λ₯Ό μ‚¬μš©ν•˜μ—¬ ꡬ성 μš”μ†Œλ₯Ό λ§Œλ“œλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μž¬λ―ΈμžˆλŠ” 것은 리 μ•‘νŠΈ λ¦¬ν”„λ ˆμ‹œμ™€ ν•¨κ»˜ μ œκ³΅λ©λ‹ˆλ‹€.

기본적으둜 μ΅œμ‹  펠리 μ¦ˆμ™€ 유효 κΈ°κ°„κ³Ό : μš°μ„ , λ‚˜λŠ” λ¬Έμ„œ λΆˆν–‰ν•œ μ „ν™˜ μƒνƒœμ—μžˆλŠ” 것을 지적 ν•  [<ReactComponent>] 우리 μ’…λ₯˜μ˜ 문제 ν”ŒλŸ¬κ·ΈμΈ 컴파일러 λ°–μœΌλ‘œ μ„  (ε–„)κΉŒμ§€ μš°ν™”μ— μ˜ν•΄ μ‚¬μš©λ˜λŠ” ASTλ₯Ό μ•ˆμ •ν™” . λ‚΄κ°€ λ§ν•˜λ €λŠ” 것은 λ¬Έμ„œ κ°€ React.functionComponent μ„ ν˜Έ ν•˜μ§€ μ•ŠμœΌλ©° Fable 3λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 λŒ€μ‹  [<ReactComponent>] λ₯Ό μ‚¬μš©ν•΄μ•Όν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

이것은 μžλ°” 슀크립트 μ½”λ“œκ°€ μƒμ„±λ˜λŠ” 방식과 관련이 μžˆμŠ΅λ‹ˆλ‹€. 이제 λ‹€μŒ React μ½”λ“œλ₯Ό κ³ λ €ν•˜μ‹­μ‹œμ˜€.

const App = ({ title }) => {
  return (
    <h1>{title}</h1>
  )
};

<App title="My React Application" />

이 JS (μ‹€μ œλ‘œλŠ” JSX)λŠ” λ‹€μŒ JS μ½”λ“œλ‘œ desugars

import { createElement } from 'react'

const App = ({ title }) => {
  return createElement("h1", null, title);
};

// <App /> compiles to a call to createElement
createElement(App, { title: "My React Application" })

<App ... /> λ₯Ό ν†΅ν•œ App ꡬ성 μš”μ†Œμ˜ μ΄ˆκΈ°ν™” λŠ” JSμ—μ„œ createElement 호좜둜 μ»΄νŒŒμΌλœλ‹€λŠ” 점에 μœ μ˜ν•΄μ•Όν•©λ‹ˆλ‹€.

λ‹€μŒ 두 가지 λ•Œλ¬Έμ— μ€‘μš”ν•©λ‹ˆλ‹€.

  • ꡬ성 μš”μ†Œμ˜ μ •μ˜ 와 생성을 λΆ„λ¦¬ν•©λ‹ˆλ‹€.
  • App κ°€ 정적 값이 될 수 μžˆμŠ΅λ‹ˆλ‹€ (Reactκ°€ μ‚¬μš©ν•˜λŠ” IDκ°€ μ˜ˆμ•½ 됨)

이제 React.functionComponent κ΅¬ν˜„ 방식은 μ •μ˜μ™€ 생성을 ν•œ λ²ˆμ— κ²°ν•©ν•˜κΈ° λ•Œλ¬Έμ— Reactμ—κ²Œ "λ‚˜μœ"λ°©μ‹μž…λ‹ˆλ‹€. 이 F # μ½”λ“œ

let app React.functionComponent("App", fun (props: {|  tite: string |}) -> Html.h1 props.title)

λ‹€μŒκ³Ό 같은 말과 κ°™μŠ΅λ‹ˆλ‹€.

let app = 
  let render(props: {|  tite: string |}) = 
    let renderFn props= Html.h1 props.title
    createElement(renderFn , props)
  render.displayName <- "App"
  render

이제 createElement κ°€ 각 ν˜ΈμΆœμ—μ„œ λ™μ μœΌλ‘œ μ •μ˜ 된 ꡬ성 μš”μ†Œλ₯Ό λ Œλ”λ§ν•˜κ³  ν•¨μˆ˜ 이름 자체λ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹  ν•¨μˆ˜μ˜ displayName λ₯Ό λ³€κ²½ν•˜κΈ° λ•Œλ¬Έμ—μ΄ "λ‚˜μœ"κ²ƒμž…λ‹ˆλ‹€.

React.functionComponent μ‚¬μš©ν•˜λŠ”μ΄ ꡬ문 섀탕은 React의 λŸ°νƒ€μž„ λ™μž‘μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμœΌλ©°, 이것이 React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λΉŒλ“œν•˜λŠ” 데 λ¬Έμ œμ—†μ΄ μ‚¬μš©ν•  μˆ˜μžˆλŠ” μ΄μœ μž…λ‹ˆλ‹€. React μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ£Όλ³€μ˜ TOOLING 이 생성 된 μ½”λ“œλ₯Ό λΆ„μ„ν•˜κΈ° μ‹œμž‘ν•˜λ©΄ λ¬Έμ œκ°€ λ°œμƒν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€. webpack, babel, react-refreshλŠ” λͺ¨λ‘ 생성 된 μ½”λ“œλ₯Όλ³΄κ³  μ—¬κΈ°μ €κΈ°μ„œ μ•½κ°„μ˜ λ§ˆλ²•μ„ μ£Όμž…ν•˜μ—¬ ν•« λͺ¨λ“ˆ ꡐ체λ₯Ό κ°€λŠ₯ν•˜κ²Œν•˜μ§€λ§Œ React.functionComponent 생성 된 μ½”λ“œλŠ” JSλ₯Ό μž‘μ„±ν•  λ•Œ React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 일반적으둜 λΉŒλ“œλ˜λŠ” 방식을 λ”°λ₯΄μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λΆˆκ°€λŠ₯ν•˜λ©° React μ£Όλ³€μ˜ λ§Žμ€ λ„κ΅¬λŠ” μ½”λ“œκ°€ ν‘œμ€€μ— 따라 μž‘μ„±λ˜μ—ˆλ‹€λŠ” 사싀을 기반으둜 κ°€μ •ν•©λ‹ˆλ‹€. 도ꡬ에 μ˜ν•΄ 생성 된 것보닀 λ°˜μ‘ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λ¬Έμ œμ— λŒ€ν•œ 해결책은 컴파일러 ν”ŒλŸ¬κ·ΈμΈμ„ 톡해 μ½”λ“œ μ»΄νŒŒμΌμ„ μ‚¬μš©μž μ •μ˜ ν•  μˆ˜μžˆλŠ” Fable 3μ—μ„œ μ œκ³΅λ©λ‹ˆλ‹€. Fable 3μ—μ„œμ΄ F # Feliz μ½”λ“œλ₯Ό κ³ λ €ν•œλ‹€λ©΄

[<ReactComponent>]
let app (title: string) = Html.h1 title 

app "My  React Application"

그런 λ‹€μŒμ΄ JS와 λ™λ“±ν•œ κ²ƒμœΌλ‘œ μ»΄νŒŒμΌλ©λ‹ˆλ‹€ (더 λ§Žμ€ 마술 λ•Œλ¬Έμ— μ •ν™•ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€)

const App = (props) { 
   const title = props.title
   return createElement("h1", null, title)
}

createElement(App, { title: "My  React Application" })

이제이 생성 된 μ½”λ“œλŠ” React 도ꡬ가 κΈ°λŒ€ν•˜λŠ” κ²ƒμ²˜λŸΌ 보이도둝 μ‚¬μš©μž μ •μ˜λ©λ‹ˆλ‹€.

  • κΈ°λŠ₯ ꡬ성 μš”μ†Œμ˜ μ •μ˜ 및 생성은 λ³„κ°œμž…λ‹ˆλ‹€.
  • ꡬ성 μš”μ†ŒλŠ” λŒ€λ¬Έμžλ‘œ μ •μ˜λ©λ‹ˆλ‹€ (예,이 μ—­μ‹œ ν•„μš”ν•˜λ©° 컴파일러 ν”ŒλŸ¬κ·ΈμΈμ΄ μžλ™μœΌλ‘œ μ •μ˜λ₯Ό λ‹€μ‹œ μž‘μ„±ν•©λ‹ˆλ‹€)
  • μž…λ ₯ 맀개 λ³€μˆ˜λŠ” μžλ™μœΌλ‘œ React μ†Œν’ˆμœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.

이 쑰합은 React μƒˆλ‘œ 고침을 μž‘λ™ν•˜κ²Œ λ§Œλ“€κ³  ν™•μž₯으둜 Feliz의 κ²½ν—˜μ„ λ„€μ΄ν‹°λΈŒ JS λ˜λŠ” TS의 κ²½ν—˜κ³Ό 맀우 κ°€κΉκ²Œ λ§Œλ“­λ‹ˆλ‹€. 이것이 ν˜Όλž€μ„ ν•΄κ²°ν•˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€. 더 κΆκΈˆν•œ 점이 있으면 μ•Œλ €μ£Όμ„Έμš” πŸ˜‰

와! κ·Έλƒ₯ ... μ™€μš°! 어리석은 μ‚¬λžŒμ€ 어리석은 μ§ˆλ¬Έμ„ν•˜κ³  λ˜‘λ˜‘ν•œ μ‚¬λžŒμ€ κ΄€λ ¨ 정보와 μ„€λͺ…이 κ°€λ“ν•œ 3 μž₯의 A4 μš©μ§€λ‘œ λŒ€λ‹΅ν•©λ‹ˆλ‹€. 🀯 당신은 κ·Έλƒ₯ ν”λ“œλŠ”κ΅°μš”! κ°μ‚¬ν•©λ‹ˆλ‹€! ❀️ 이제 μ΄ν•΄ν•˜κ³  λŒ€μ‹  Attributeλ₯Ό μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€.

μ–΄λ–»κ²Œ λ“  ꡬ성 μš”μ†Œμ˜ 이름을 μ§€μ •ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆκΉŒ ( React.functionComponent 의 첫 번째 맀개 λ³€μˆ˜λ₯Ό μ‚¬μš©ν–ˆλ˜ κ²ƒμ²˜λŸΌ) μ•„λ‹ˆλ©΄ 속성 접근에 더 이상 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

이제 μ΄ν•΄ν•˜κ³  λŒ€μ‹  Attributeλ₯Ό μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€.

λŒ€λ°•! λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ πŸ˜‰ μ§€κΈˆ λ‹Ήμž₯ μ•Œμ•„μ•Ό ν•  μœ μΌν•œ λ¬Έμ œλŠ” μž…λ ₯ propsκ°€ React-refresh에 μ•½κ°„ λ¬Έμ œκ°€ 될 수 μžˆμœΌλ―€λ‘œ λ ˆμ½”λ“œ μœ ν˜•μ„ μ‚¬μš©ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ λŒ€μ‹  읡λͺ… λ ˆμ½”λ“œλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ κΈ°λ³Έ 맀개 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 경고없이 [<ReactComponent>] λ¬Έμ„œλ₯Ό μž‘μ„±ν•  수 μžˆλ„λ‘ λ¬Έμ œκ°€ 곧 ν•΄κ²°λ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.

μ–΄λ–»κ²Œ λ“  μ»΄ν¬λ„ŒνŠΈμ˜ 이름을 μ§€μ •ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ (React.functionComponent의 첫 번째 맀개 λ³€μˆ˜λ₯Ό μ‚¬μš©ν–ˆλ˜ κ²ƒμ²˜λŸΌ) μ•„λ‹ˆλ©΄ 속성 접근에 더 이상 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

μ•„λ‹ˆμš”, μœ μΌν•œ μš”κ΅¬ 사항은 ꡬ성 μš”μ†Œκ°€ [<ReactComponent>] ν•¨μˆ˜ μ •μ˜μ— λŒ€ν•΄ μˆ˜ν–‰ν•˜λŠ” μž‘μ—… 쀑 ν•˜λ‚˜ 인 λŒ€λ¬Έμž κ°’μœΌλ‘œ μ»΄νŒŒμΌλœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. : smile : μ—¬κΈ°μ„œ κ΅¬ν˜„ν•  수

@Dzoukr λŠ” λ°˜μ‘ ꡬ성 μš”μ†Œμ— 이름을 μ‚¬μš©ν•˜λŠ” μœ μΌν•œ μ΄μœ λŠ” 디버그 도ꡬλ₯Ό κ°œμ„ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

@Shmew Yup,ν•˜μ§€λ§Œ κ·ΈλŸ¬ν•œ 이름을 μΆ”κ°€ν•˜κΈ° μœ„ν•΄ ReactComponent μƒμ„±μžμ— κ³ΌλΆ€ν•˜κ°€ μ—†κΈ° λ•Œλ¬Έμ— μš”μ²­ν•œ κ²ƒμž…λ‹ˆλ‹€.

λ”°λΌμ„œ [<ReactComponent>] λŒ€ functionComponent μ§ˆλ¬Έμ„ κ³„μ†ν•©λ‹ˆλ‹€ : 후크!

일뢀 μƒνƒœλ₯Ό μ΄ˆκΈ°ν™”ν•΄μ•Όν•˜λŠ” ꡬ성 μš”μ†Œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‹€ν–‰νžˆλ„, μš°λ¦¬λŠ” μ‚¬μš©ν•  μˆ˜μžˆλŠ” λ§Žμ€ 쒋은 후크가 μžˆμŠ΅λ‹ˆλ‹€! λ‚˜λŠ” 이것을 μ“΄λ‹€ :

[<ReactComponent>]
let Entrypoint() =
    let drawing, updateDrawing = React.useState(Deferred.HasNotStartedYet)
    let loader = React.useDeferredCallback((fun () -> loadDrawing()), updateDrawing)

    React.useEffect(loader, [||])
    // etc

μ•„μ•„, 이것을 μ‹€ν–‰ν•˜λ €κ³  ν•  λ•Œ μ½˜μ†”μ΄ μŠ¬ν”„κ³  였λ₯˜λ‘œ 가득 μ°¨ μžˆμŠ΅λ‹ˆλ‹€.

Uncaught Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.
    React 

μœ„μ˜ λ°˜μ‘ 디버그 단계λ₯Ό κ±°μ³€μŠ΅λ‹ˆλ‹€. 사싀이 μ•„λ‹Œ 것 κ°™μŠ΅λ‹ˆλ‹€. μž‘λ™ν•΄μ•Όν•©λ‹ˆκΉŒ? 이것은 Fable 3 μœ μΌν•œ κ²ƒμž…λ‹ˆκΉŒ? (μ €λŠ” μ—¬μ „νžˆ Fable 2λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.)

λ‚΄ μ΄ν•΄λŠ” reactcomponent 속성이 μš°ν™” 3 컴파일러 ν”ŒλŸ¬κ·ΈμΈμ΄κΈ° λ•Œλ¬Έμ— μž‘λ™ν•˜λ €λ©΄ μš°ν™” 3이 ν•„μš”ν•˜λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

@landy μ•„, ν™•μ‹€νžˆ ν•  κ²ƒμž…λ‹ˆλ‹€. LemmeλŠ” Fable 3을 μž‘λ™μ‹œν‚€κ³  μž μ‹œ 후에보고 ν•  κ²ƒμž…λ‹ˆλ‹€.

μ•Ό! λ„€, μ €λ₯Ό κ³ μ³€μŠ΅λ‹ˆλ‹€. 이 PR 을 μ „ν™˜ κ°€μ΄λ“œλ‘œ μ‚¬μš©

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

l3m picture l3m  Β·  7μ½”λ©˜νŠΈ

Dzoukr picture Dzoukr  Β·  9μ½”λ©˜νŠΈ

alfonsogarciacaro picture alfonsogarciacaro  Β·  6μ½”λ©˜νŠΈ

cmeeren picture cmeeren  Β·  6μ½”λ©˜νŠΈ

alfonsogarciacaro picture alfonsogarciacaro  Β·  6μ½”λ©˜νŠΈ