Kotlin рдкрд░ рдПрдХ рдФрд░ рдбреАрдПрд╕рдПрд▓ рдпрд╛ рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкреАрдбреАрдПрдл рдХреИрд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд┐рдпрд╛



рдЖрдк рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкреГрд╖реНрда рдХреЛ рдХреЗрд╡рд▓ рд▓реЗ рдФрд░ рдкреНрд░рд┐рдВрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкреГрд╖реНрда рд╡рд┐рднрд╛рдЬрдХ, рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдПрдХ рдмрд╛рд░ рдПрдХ рд░реЗрдВрдбрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдпрд╣ рд░рд┐рдПрдХреНрдЯрдбреЙрдо рдФрд░ рдирд┐рдпрдорд┐рдд рдПрдЪрдЯреАрдПрдордПрд▓ рджреЛрдиреЛрдВ рдЙрддреНрдкрдиреНрди рдХрд░реЗ, рдЬрд┐рд╕реЗ рдкреАрдбреАрдПрдл рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХреЗред

рд╕рдмрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдЕрдкрдирд╛ рдбреАрдПрд╕рдПрд▓ рд╣реИ, рдФрд░ html рдХрд╛ рдЕрдкрдирд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВ? рдПрдХ рдФрд░ рд▓рд┐рдЦреЛ!

рдореИрдВ рд▓рдЧрднрдЧ рднреВрд▓ рдЧрдпрд╛, рдпрд╣ рд╕рдм рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдЯрд▓рд┐рди рдбреАрдПрд╕рдПрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд╣реИред

рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдЙрд░реБрдХ-рд╣реИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?


рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд░рд┐рдкреЛрд░реНрдЯреЗрдВ рд╣реИрдВ рдФрд░ рдЙрди рд╕рднреА рдХреЛ рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

  • рдкреНрд░рд┐рдВрдЯ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓реЗрдВ, рд╡рд╣ рд╕рдм рдХреБрдЫ рдЫрд┐рдкрд╛рдПрдВ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдХреЗрд╡рд▓ рдмрдЯрди, рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рдЬреИрд╕реА рд╣реИ рдореБрджреНрд░рд┐рдд рдХреА рдЬрд╛рдПрдЧреАред рдФрд░ рдпрд╣ рднреА, рдЕрдЧрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЯреЗрдмрд▓ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрд▓рдЧ рдкреГрд╖реНрда рдкрд░ рд╣реЛред рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдЬреЛрдбрд╝рд╛ рд▓рд┐рдВрдХ, рджрд┐рдирд╛рдВрдХ, рдЖрджрд┐ рдЬреЛ рд╕рд╛рдЗрдЯ рд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╕рдордп рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдХреНрд░реЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЬреЛ рдкреАрдбреАрдПрдл рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рдПрдХ рдорд┐рд▓рд╛, рдпрд╣ рдмреАрдЯрд╛ рдФрд░ рдЗрд╕рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
  • рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЛ рдХреИрдирд╡рд╕ рдореЗрдВ рдмрджрд▓ рджреЗрдВ рдФрд░ рдкреАрдбреАрдПрдл рдХреЛ рдЗрд╕рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рджреЗрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ HTML рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдмрд┐рдирд╛ рдмрдЯрди рдФрд░ рдкрд╕рдВрдж рдХреЗред рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП рддрддреНрд╡ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдЖрдк рдкреГрд╖реНрда рд╡рд┐рд░рд╛рдо рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ ReactDom рдФрд░ HTML рджреЛрдиреЛрдВ рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВ рдкреГрд╖реНрда рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдЯреИрдЧ рдбрд╛рд▓рдХрд░ рдкреАрдбреАрдПрдл рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдХрдПрдВрдб рдкрд░ HTML рднреЗрдЬ рд╕рдХрддрд╛ рд╣реВрдВред

рдХреЛрдЯрд▓рд┐рди рдХреЗ рдкрд╛рд╕ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдпрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬреЛ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк-рд╕реЗрдл рдбреАрдПрд╕рдПрд▓ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдпрд╣ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

JetBrains рдиреЗ HTML рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рд▓рд┐рдЦреА рд╣реИред рдпрд╣ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдЬрд╛рд╡рд╛ рдФрд░ рдЬреЗрдПрд╕ рджреЛрдиреЛрдВ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рднреА dsl рд╣реИ, рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИред

рд╣рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рд╣рдореЗрдВ ReactDom рдпрд╛ рд╢реБрджреНрдз HTML рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╕рд╛рдордЧреНрд░реА рд╣реИ?


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдореЗрдВ рдЦреЛрдЬ рдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд▓реЗрдВред рдЗрд╕ рддрд░рд╣ рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдФрд░ HTML рдкрд░ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
рдПрдЪрдЯреАрдПрдордПрд▓
fun RBuilder.renderReactTable( search: String, onChangeSearch: (String) -> Unit ) { table { thead { tr { th { attrs.colSpan = "2" //(1) attrs.style = js { border = "solid" borderColor = "red" } //(2) +":" search(search, onChangeSearch) //(3) } } tr { th { +"" } th { +"" } } } tbody { tr { td { +"" } td { +"" } } tr { td { +"" } td { +"" } } } } } 

 fun TagConsumer<*>.renderHtmlTable( search: String ) { table { thead { tr { th { colSpan = "2" //(1) style = """ border: solid; border-color: red; """ //(2) +": " +(search?:"") //(3) } } tr { th { +"" } th { +"" } } } tbody { tr { td { +"" } td { +"" } } tr { td { +"" } td { +"" } } } } } 



рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рдкрдХреНрд╖ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдЕрдВрддрд░ рдХреНрдпрд╛ рд╣реИ:

  1. Html рдореЗрдВ, style рдФрд░ colSpan рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░, рд░рд┐рдПрдХреНрдЯ рдореЗрдВ, colSpan рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  2. рд╢реИрд▓реА рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рднрд░рддреА рд╣реИред рдпрджрд┐ HTML рдореЗрдВ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпрдорд┐рдд рд╕реАрдПрд╕рдПрд╕ рд╣реИ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдпрд╣ рдПрдХ рдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдлрд╝реАрд▓реНрдб рдирд╛рдо рдЬреЗрдПрд╕ рд╕реАрдорд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдорд╛рдирдХ рд╕реАрдПрд╕рдПрд╕ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИред
  3. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдо рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, HTML рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрдпрд╛рди рд╕реЗ рд╢реБрд░реВ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдпреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреАрдПрд╕рдПрд▓ рд╣реИрдВред рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП, рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рдкрд╛рд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдРрд╕реА рдкрд░рдд рд▓рд┐рдЦрдиреА рд╣реЛрдЧреА, рдЬреЛ рд▓рдЧрднрдЧ рдПрдХ рдЬреИрд╕реА рд▓рдЧреЗ, рд▓реЗрдХрд┐рди рд░рд┐рдПрдХреНрдЯ рдПрдкреАрдЖрдИ рдФрд░ рдПрдЪрдЯреАрдПрдордПрд▓ рдПрдкреА рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХрдВрдХрд╛рд▓ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЛ


рдЕрднреА рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдПрдХ рдЦрд╛рд▓реА рд╕реЗрд▓ рд╕реЗ рдПрдХ рдЯреИрдмрд▓реЗрдЯ рдмрдирд╛рдПрдВ:

 table { thead { tr { th { } } } } 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ HTML рдЯреНрд░реА рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╕рдордЧреНрд░ рдФрд░ рдЖрдЧрдВрддреБрдХ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдХреЗрд╡рд▓ рд╣рдо рдЖрдЧрдВрддреБрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдХреНрдпреЛрдВ - рдпрд╣ рдмрд╛рдж рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЦреНрдп рдЗрдХрд╛рдЗрдпрд╛рдБ ParentTag рдФрд░ TagWithParent рд╣реЛрдВрдЧреАред рдкреЗрд░реЗрдВрдЯрдЯреИрдЧ рдХреЛ рдХреЛрдЯрд▓рд┐рди рдЖрдкреА рд╕реЗ HTML рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╢реБрдХреНрд░ рд╣реИ рдХрд┐ рдпрд╣ HTML рдФрд░ рд░рд┐рдПрдХреНрдЯ рдПрдкреАрдЖрдИ рджреЛрдиреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рдЯреИрдЧрд╡рд┐рдердкреЗрдВрдЯ рдЦреБрдж рдЯреИрдЧ рдХреЛ рдФрд░ рджреЛ рдлрдВрдХреНрд╢рдиреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рджреЛ рд╡рд╛рдИ рд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ рдкреЗрд░реЗрдВрдЯ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред

 abstract class ParentTag<T : HTMLTag> { val tags: MutableList<TagWithParent<*, T>> = mutableListOf() //     protected fun RDOMBuilder<T>.withChildren() { ... } //  reactAppender    protected fun T.withChildren() { ... } //  htmlAppender    } class TagWithParent<T, P : HTMLTag>( val tag: T, val htmlAppender: (T, P) -> Unit, val reactAppender: (T, RDOMBuilder<P>) -> Unit ) 

рдЖрдкрдХреЛ рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдЬреЗрдирд░рд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп HTML рдХреЗ рд▓рд┐рдП dsl рдмрд╣реБрдд рд╕рдЦреНрдд рд╣реИред рдпрджрд┐ React рдореЗрдВ рдЖрдк рдХрд╣реАрдВ рд╕реЗ рднреА, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ div рд╕реЗ td рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ HTML рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ tr рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХреЛ рдЦреАрдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреИрдЧреЛрдВ рдХреЛ рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  1. рд╣рдо рджреЛ рд╡рд┐рдЬрд╝рд┐рдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ HTML рдХреЗ рд▓рд┐рдПред рд╡реЗ рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╢реИрд▓рд┐рдпреЛрдВ, рд╡рд░реНрдЧреЛрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
  2. рд╣рдо рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдкреИрд░реЗрдВрдЯ рдореЗрдВ рдЯреИрдЧ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдереНрд░реЗрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
 class THead : ParentTag<THEAD>() { fun visit(builder: RDOMBuilder<TABLE>) { builder.thead { withChildren() } } fun visit(builder: TABLE) { builder.thead { withChildren() } } } fun Table.thead(block: THead.() -> Unit) { tags += TagWithParent(THead().also(block), THead::visit, THead::visit) } 


рдЕрдВрдд рдореЗрдВ, рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ tr рдХреЛ thead рдФрд░ tbody рджреЛрдиреЛрдВ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рдпрд╛рддреНрд░рд╛ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдЪрд╛рд░ рдЕрдзрд┐рднрд╛рд░ рд╕рд╛рдордиреЗ рдЖрдПред

рдирдХрд▓ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЬрд┐рд╕реЗ рдЯрд╛рд▓рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛
 class Tr( val classes: String? ) : ParentTag<TR>() { fun visit(builder: RDOMBuilder<THEAD>) { builder.tr(classes) { withChildren() } } fun visit(builder: THEAD) { builder.tr(classes) { withChildren() } } fun visit(builder: RDOMBuilder<TBODY>) { builder.tr(classes) { withChildren() } } fun visit(builder: TBODY) { builder.tr(classes) { withChildren() } } } 


рдорд╛рдВрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг


рд╕реЗрд▓ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдЬреЛрдбрд╝реЗрдВ:

  table { thead { tr { th { +": " } } } } 

'+' рдХреЗ рд╕рд╛рде рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдЯреИрдЧ рдореЗрдВ unaryPlus рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛, рдЬрд┐рд╕рдореЗрдВ рдкрд╛рда рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

 abstract class TableCell<T : HTMLTag> : ParentTag<T>() { operator fun String.unaryPlus() { ... } } 

рдпрд╣ рдЖрдкрдХреЛ td рдпрд╛ th рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ '+' рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдкреЗрдбрд╝ рдкрд░ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рдЯреИрдЧ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред

рддреНрд╡рдЪрд╛ рдХреЛ рдирд┐рдЦрд╛рд░реЗрдВ


рдЕрдм рд╣рдореЗрдВ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ HTML рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВ рдФрд░ рдПрдкреАрдЖрдИ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВред рдХреЛрд▓рд╕реНрдкреИрди рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЕрдВрддрд░ рд╕реНрд╡рдпрдВ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реИрд▓реА рдХреЗ рдЧрдарди рдореЗрдВ рдЕрдВрддрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╢реИрд▓реА рдПрдХ рдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдФрд░ рдЖрдк рдлрд╝реАрд▓реНрдб рдирд╛рдо рдореЗрдВ рдПрдХ рд╣рд╛рдЗрдлрд╝рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдКрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред HTML рдПрдкреАрдЖрдИ рдореЗрдВ рд╣рдо рд╣рдорд╕реЗ рдирд┐рдпрдорд┐рдд рд╕реАрдПрд╕рдПрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЗрд╕ рд╕рдордп рдФрд░ рдЙрд╕ рд╕рдордп рджреЛрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдКрдБрдЪрд╛ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдПрдкреА рдореЗрдВ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдкрд░рдд рд▓рд┐рдЦреА:

рдЬреЛ рдЖрд▓рд╕реА рдирд╣реАрдВ рд╣реИ, рд╡рд╣ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
 class Style { var border: String? = null var borderColor: String? = null var width: String? = null var padding: String? = null var background: String? = null operator fun invoke(callback: Style.() -> Unit) { callback() } fun toHtmlStyle(): String = properties .map { it.html to it.property(this) } .filter { (_, value) -> value != null } .joinToString("; ") { (name, value) -> "$name: $value" } fun toReactStyle(): String { val result = js("{}") properties .map { it.react to it.property(this) } .filter { (_, value) -> value != null } .forEach { (name, value) -> result[name] = value.toString() } return result.unsafeCast<String>() } class StyleProperty( val html: String, val react: String, val property: Style.() -> Any? ) companion object { val properties = listOf( StyleProperty("border", "border") { border }, StyleProperty("border-color", "borderColor") { borderColor }, StyleProperty("width", "width") { width }, StyleProperty("padding", "padding") { padding }, StyleProperty("background", "background") { background } ) } } 


рд╣рд╛рдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдПрдХ рдФрд░ рд╕реАрдПрд╕рдПрд╕ рд╕рдВрдкрддреНрддрд┐ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рд╣рд╛рдВ, рдФрд░ рдПрдХ рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдирдХреНрд╢рд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк-рд╕реЗрдлред рдореИрдВ рднреА рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ enums рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╢рд╛рдпрдж, рдЕрдЧрд░ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдирд╣реАрдВ рд▓рд┐рдЦрд╛, рддреЛ рдореИрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕рд╡рд╛рд▓ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░реВрдБрдЧрд╛ред

рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рдзреЛрдЦрд╛ рджрд┐рдпрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рд╡рд░реНрдЧ рдХреЗ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреА:

 th { attrs.style { border = "solid" borderColor = "red" } } 

рдпрд╣ рдХреИрд╕реЗ рдЬрд╛рддрд╛ рд╣реИ: attr.style рдХреНрд╖реЗрддреНрд░ рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЦрд╛рд▓реА рд╢реИрд▓реА () рд╣реИред рдпрджрд┐ рдЖрдк рдСрдкрд░реЗрдЯрд░ рдордЬрд╝реЗрджрд╛рд░ рдЖрд╣реНрд╡рд╛рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдЖрдк attrs.style() рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдЯрд╛рдЗрд▓ рдПрдХ рдлрд╝реАрд▓реНрдб рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХреЙрд▓ рдореЗрдВ, рдСрдкрд░реЗрдЯрд░ рдордЬрд╝реЗрджрд╛рд░ рдЖрд╣реНрд╡рд╛рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ - рдХреЙрд▓рдмреИрдХ: рд╕реНрдЯрд╛рдЗрд▓ред () -> рдпреВрдирд┐рдЯред рдЪреВрдВрдХрд┐ рдпрд╣ рд▓рдВрдмреЛрджрд░ рд╣реИ, рддреЛ (рдХреЛрд╖реНрдардХ) рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВред

рд╡рд┐рднрд┐рдиреНрди рдХрд╡рдЪ рдкрд░ рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ


рдпрд╣ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдЗрдирдкреБрдЯ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВ, рдФрд░ HTML рдореЗрдВ рд╕рд┐рд░реНрдл рдЯреЗрдХреНрд╕реНрдЯред рдореИрдВ рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

 react { search(search, onChangeSearch) } html { +(search?:"") } 

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рд░реЛрд╣ Rreact рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╕рдореНрдорд┐рд▓рд┐рдд рдЯреИрдЧ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдЯреИрдЧ рдкрд░, рдЖрдк рдЗрдирдлрд╝рд┐рдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдЪрдЯреАрдПрдордПрд▓ рдПрдкреАрдЖрдИ рдХреЛ рд▓реИрдореНрдмреНрдбрд╛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Infix modifier html рдХреЛ рдмрд┐рдирд╛ рдбреЙрдЯ рдХреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдЧрд░ {} рдФрд░ {} рдХреЗ рд╕рдорд╛рди рд╣реИред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдЧрд░-рдФрд░ рдореЗрдВ, html рдХреЙрд▓ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рдпрд╣ рдХрдИ рдмрд╛рд░ рдХрд╛рдо рдореЗрдВ рдЖрдпрд╛ред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 class ReactTag<T : HTMLTag>( private val block: RBuilder.() -> Unit = {} ) { private var htmlAppender: (T) -> Unit = {} infix fun html(block: (T).() -> Unit) { htmlAppender = block } ... } fun <T : HTMLTag> ParentTag<T>.react(block: RBuilder.() -> Unit): ReactTag<T> { val reactTag = ReactTag<T>(block) tags += TagWithParent<ReactTag<T>, T>(reactTag, ReactTag<T>::visit, ReactTag<T>::visit) return reactTag } 


рд╕рд░реБрдорди рдорд╛рд░реНрдХ


рдПрдХ рдФрд░ рд╕реНрдкрд░реНрд╢ред рдкреЗрд░реЗрдВрдЯрдЯреИрдЧ рдФрд░ рдЯреИрдЧрд╡рд┐рдердкреИрд░реЗрдиреНрдЯ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдШрд╛рд╡ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдШрд╛рд╡ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдПрдиреЛрдЯреЗрд╢рди @ рдбреАрдПрд╕рдПрд▓рдорд╛рд░реНрдХрд░ рдЦрдбрд╝рд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдХреЗ рдореВрд▓ рд╕реЗ рд╣реИ:

 @DslMarker annotation class StyledTableMarker @StyledTableMarker interface Tag 

рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрди рдЬреИрд╕реЗ рдЕрдЬреАрдм рдХреЙрд▓ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рди рджреЗ:

 td { td { } } tr { thead { } } 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рдРрд╕реА рдмрд╛рдд рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдЧрд╛ ...

рд▓рдбрд╝рд╛рдИ рдХреЗ рд▓рд┐рдП!


рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА ReactDom рдФрд░ HTML рджреЛрдиреЛрдВ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦреЛ рдХрд╣реАрдВ рднреА!

 fun Table.renderUniversalTable(search: String?, onChangeSearch: (String?) -> Unit) { thead { tr { th { attrs.colSpan = 2 attrs.style { border = "solid" borderColor = "red" } +":" react { search(search, onChangeSearch) //(*) } html { +(search?:"") } } } tr { th { +"" } th { +"" } } } tbody { tr { td { +"" } td { +"" } } tr { td { +"" } td { +"" } } } } 

(*) рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ - рдпрд╣ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рдЦреЛрдЬ рдХрд╛рд░реНрдп рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣реИред рдирдП рдбреАрдПрд╕рдПрд▓ рдореЗрдВ рдХреЗрд╡рд▓ рдЖрдо рдЯреИрдЧ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдРрд╕реЗ рдХреЛрдб рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣рд╛рдБ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдкреАрдбреАрдПрдл рдкреНрд░рд┐рдВрдЯрдЖрдЙрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдФрд░ рдирд╛рдореЛрдВ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ред рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдЙрд╕реА рдкреГрд╖реНрда рдХрд╛ рдПрдХ рдкреАрдбреАрдПрдл рдкреНрд░рд┐рдВрдЯрдЖрдЙрдЯ , рд▓реЗрдХрд┐рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ред рдУрд╡рд░рд▓реЗрдЗрдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЯреЗрдмрд▓ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреА рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВред

рдбреАрдПрд╕рдПрд▓ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХреЗ рд░реВрдк рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЗрдВрджреНрд░рд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдЯрд▓рд┐рди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд░реЛрдЬрдорд░реНрд░рд╛ рдХреА рдЬрд┐рдВрджрдЧреА рдореЗрдВ рднреА рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред

рд╢рд╛рдпрдж рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЕрд▓рдЧ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рджреЛрд╣рд░рд╛рд╡ рднреА рдерд╛, рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдЫреБрдЯрдХрд╛рд░рд╛ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддрд╛ рдерд╛ (рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, JetBarins HTML рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкреАрдврд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред

рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдПрдЪрдЯреАрдПрдордПрд▓ рдПрдкрд┐ (рдореИрдВ рд▓рдЧрднрдЧ рдирд╣реАрдВ рдЭрд╛рдВрдХрддрд╛) рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдбреАрдПрд╕рдПрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ред рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдбреАрдПрд╕рдПрд▓ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд░ рдкреВрд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рд╣реИред рдЖрдк рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреГрд╖реНрда рдЯреИрдЧ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЫрдкрд╛рдИ рдХрд░рддреЗ рд╕рдордп рдЖрдк " рд╕рдордЭреМрддреЗ " рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЖрдк рд╕рд░реНрд╡рд░ рдкрд░ рдЗрд╕ рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЦреЛрдЬ рдЗрдВрдЬрди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА HTML рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

PS рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреАрдбреАрдПрдл рдХреЛ рдЖрд╕рд╛рди рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВ

рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде рд╢рд▓рдЬрдо

Source: https://habr.com/ru/post/hi430238/


All Articles