Svelte: рдХреНрд░рд┐рдпрд╛рдПрдБ рдЬрд╛рдирдирд╛

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣рд╕рди рдкрд░ @sanReal рдХрд╛ рдПрдХ рд▓реЗрдЦ рдЫрдкрд╛ , рдЬрд╣рд╛рдБ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдиреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдХрд┐ рдХрд┐рд╕ рддрдХрдиреАрдХ рдФрд░ рд╕реНрд╡реЗрд▓реНрдЯ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рд╕реЗ рд╕реАрдЦрд╛ред рдореБрдЭреЗ рдЙрдирдХреА рд╕реВрдЪреА рдореЗрдВ рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдлреНрд░реЗрдорд╡рд░реНрдХ рдЯреВрд▓ - рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рджреЗрдЦрдХрд░ рдереЛрдбрд╝рд╛ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, @sveltejs рд╕рдореБрджрд╛рдп рдХреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдирд╛, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Svelte рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдХрднреА-рдХрднреА рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рд░ рдХреЛрдИ Actions рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ , рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрд╣рд╛рдВ рдЙрдирдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХрд╛рд░реНрдп рдХреНрдпрд╛ рд╣реИрдВ рдФрд░, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде, рдореИрдВ рдЙрдирдХрд╛ рдЖрд╡реЗрджрди рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред


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


: +7 <input type="text" />

рдЬрдм рдХрд╛рд░реНрдп рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдирдХ HTML рддрддреНрд╡ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рддрддреНрд╡ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЖрдо рдмрд╛рдд рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рдЧреИрд░-рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рддрд░реНрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк Svelte рдореЗрдВ рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


<!-- InputDigits.svelte -->
<script>
    function clean_value(e){
        e.target.value =  e.target.value.replace(/[^\d]/g,'');
    }
</script>

<input type="text" on:input={clean_value} />

<!-- App.svelte -->
...
: +7 <InputDigits />

рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджреЗрдЦреЗрдВ


рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрддреНрд╡ <input/>рдЕрдм рдШрдЯрдХ рдХреЗ рдЕрдВрджрд░ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдм рдЗрд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд HTML рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ - рдХрд┐рд╕реА рднреА рд╕реАрдПрд╕рдПрд╕ рд╡рд░реНрдЧреЛрдВ, рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ, рдпрд╛ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ "рд▓рдЯрдХрд╛" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред


Svelte тАФ ( Actions). Svelte , , , , тАФ "" , . тАФ - HTML-. , DOM. DOM-, .


:


<script>
    function onlydigits(node) {

        function clean_value(){
            node.value = node.value.replace(/[^\d]/g,'');
        }

        node.addEventListener('input',clean_value);

        return {
            destroy: ()=>node.removeEventListener('input',clean_value)
        }

    }
</script>

: +7 <input type="text" use:onlydigits />


onlydigits, . , DOM- node input. , destroy, DOM-, .


Svelte, - HTML- , use. <input/> use:onlydigits.


. , 10 :


<script>
    function onlydigits(node) { ... }

    function max10symbols(node) {

        function trim_value(){
            node.value = node.value.substring(0, 10);
        }

        node.addEventListener('input',trim_value);

        return {
            destroy: ()=>node.removeEventListener('input',trim_value)
        }

    }
</script>

: +7 <input type="text" use:onlydigits use:max10symbols />


<input /> тАФ use:onlydigits use:max10symbols. .


use , . , . :


<script>
    function format_by_pattern(node,pattern) {

        function set_cursor(){
            const match = node.value.match(/[\d]/gi);
            const pos = match ? node.value.lastIndexOf(match.pop())+1 : 0;
            node.setSelectionRange(pos, pos);
        }

        function format_value(e){
            let digits = node.value.replace(/[^\d]/g,'').split('');
            node.value = pattern.replace(/[*]/g,(m)=>digits.shift()||m);
            set_cursor();
        }

        node.addEventListener('input',format_value);

        format_value();

        return {
            destroy: ()=>node.removeEventListener('input',format_value)
        }

    }
</script>

: +7 <input type="text" use:format_by_pattern={'(***) ***-**-**'} /> <br/>
: <input type="text" use:format_by_pattern={' **** тДЦ******'} />


<input /> HTML-. format_by_pattern, . , Svelte, JavaScript-.


, , , . .


<script>
    function format_by_pattern(node,pattern) {

        function set_cursor(){...}
        function format_value(){...}

        ...

        return {
            destroy: ...,
            update: (new_pattern)=>{
                pattern=new_pattern;
                format_value();
            }
        }

    }

    let zagran = false;
</script>

: +7 <input type="text" use:format_by_pattern={'(***) ***-**-**'} /> <br/>
: <input type="text" use:format_by_pattern={zagran ? ' ** тДЦ*******' : ' **** тДЦ******'} /> <br/>
<input type="checkbox" bind:checked={zagran}/> - 


, . , , bind:checked, zagran true false. , Svelte use:format_by_pattern.


, , DOM-, <input /> DOM-, . .


, , , тАФ update. , . .


. , . , , DOM- тАФ , . Svelte. Svelte , , .


рдиреЛрдЯ: рдореЙрд╕реНрдХреЛ рдореЗрдВ рдмрд╣реБрдд рдЬрд▓реНрдж Svelte Russia Meetup # 1 рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред рд░рдЬрд┐рд╕реНрдЯрд░, рдЕрднреА рднреА рдХрдорд░рд╛ рд╣реИред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрдкрд╕реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛ рдкрд╛рдПрдВрдЧреЗ, рдЖрдпреЛрдЬрди рдХрд╛ рдПрдХ рдкреНрд░рд╕рд╛рд░рдг рдФрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд╛ рдЖрдпреЛрдЬрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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


All Articles