原生与组件

  框架用的越多越觉得繁琐,是没有理解代码还是需求更新的太快?谁知道呢,写一个form感叹下

原生form

        <form action="next.html" method="get">
            <input type="text" name="name" value="" />
            <input type="text" name="pass" value="" />
            <input type="submit" value=""/>
        </form>

不知道还有没有人使用这种代码,他用起来很简单,不用js,是的,那个时候也没什么js,只要你点击submit按钮,就会自动跳转到下一个页面,很棒很酷,传递的参数也是最为标准的

复杂对象-->数据结构的改变

数据量的提升(我是说一个页面中的form的属性),严格来说这不是问题,form属性不管变得多多,都可以在后台接受,转换并处理,问题就在于后台希望前端传过去的数据是一种直接区分好的方式,比如

        <form action="next.html" method="get">
            基础信息
            <input type="text" name="user.name" value="" />
            权限信息
            <input type="text" name="role.name" value="" />
            地址信息
            <input type="text" name="address.name" value="" />
            <input type="submit" value=""/>
        </form>

后端在处理时会根据.来将数据处理成不同的model,以方便后台的调用,复杂对象中,数组传递的格式绝逼是千奇百怪我见过温顺点的,重名变数组(需要对接受数据进行判断),也见过暴躁点的,数据必须[],里面填写index,当然更著名的方式就是json

既然传递json格式form的写法就变得复杂,必须搭配动态收集数据的方式(而非原生),比如js/jquery,jq中的$("form").serialize()可以很好的将表单序列化,但是并没有转换为json,我也是在这个地方写了我第一个jq方法,serializeJSON/serializeObject,偶尔会换着名字玩,这个方法我会不断的变更,不同的程序猿的数组的理解不一样,可能会要求在json中的其他数组使用,.|甚至@@@来分割数组的

复杂需求-->action的无奈

表单验证+无刷新

无刷新的请求流行之后,action的实现基本被淘汰,至此这个属性已经可以被遗忘(我用这个属性好多年,通过他修改url,好方便的,偶尔也会用action=‘‘,配合路由用来刷新页面),至于表单验证,当年也是找了好久验证的组件...

至此一个form可能会长成这样

        <form id="form">

            <input id="user" type="text" name="user" value="" />

            <input id="name" type="text" name="pass" value="" />

            <input id="submit" type="button" value="" />
        </form>
        <script type="text/javascript">
            $("#user").validation({
                //    ...
            })
             $("#name").validation({
                //    ...
            })
             $("#submit").on("click", function() {
                var formdata = $("#form").serializeJSON();
                $.post("login.do", formdata).done(function() {
                    //...
                })
            })
        </script>

如果你做过,你会发现这就是我们的工作,很难维护,也很恶心...

再往下走就是两条道了

js整合-->ext

form中的组件过于分散,觉得不好维护,不好找,对吧,很简单,写一个$.form,由$.form去创建里面的input,这样所有相关组件都在form当中

        <form id="form"></form>
        <script type="text/javascript">
            $("#form").form({
                items: [{
                    label: "",
                    type: "input",
                    name: "name"
                    validation: ""
                }, {
                    label: "",
                    type: "input",
                    name: "user"
                    validation: ""
                }],
                buttons: [{
                    icons: 1,
                    onCilck: function() {
                        var formdata = $("#form").serializeJSON();
                        $.post("login.do", formdata).done(function() {
                            //...
                        })
                    }
                }]
            })
        </script>

至此,html就是为了创建form而生,其他全是js,其实仔细想想,html中的form好像也没用存在的必要了,比如

        <form id="form"></form>
        <script type="text/javascript">
            create("form")({
                render:"#form",
                items: [{
                    label: "",
                    type: "input",
                    name: "name"
                    validation: ""
                }, {
                    label: "",
                    type: "input",
                    name: "user"
                    validation: ""
                }],
                buttons: [{
                    icons: 1,
                    onCilck: function() {
                        var formdata = $("#form").serializeJSON();
                        $.post("login.do", formdata).done(function() {
                            //...
                        })
                    }
                }]
            })
        </script>

将render改成window,在运行到render时,直接在window中创建form,所有功能全由js生成。。。

特点是简单,至少识别起来很简单,唯一的问题就是太长了,一行能解决的事情,写个5,6行,如果你喜欢这种风格或者你们公司计算代码量,可以尝试一下

html增强-->mv*

如果你怀念当年有爱的原生form,可以尝试着修改html解析引擎,或者在html中定义自己的属性,做完之后大概是这样的

        <form id="form">

            <input id="user" validation="" type="text" name="user" value="" />

            <input id="name"  validation="" type="text" name="pass" value="" />

            <input id="submit" type="button" value="" />
        </form>
        <script type="text/javascript">

             $("#submit").on("click", function() {
                var formdata = $("#form").serializeJSON();
                $.post("login.do", formdata).done(function() {
                    //...
                })
            })

             $("[validation]").each(function(){
                 $(this).validation({
                     //...
                 })
             })
        </script>

submit不太好弄,他有一个回调,而这个回调并非原生的,我们很难定位(因为分散),统一起来就舒服多了,比如这样

        <form id="form" ajax="url">
            <input id="user" validation="" type="text" name="user" value="" />

            <input id="name"  validation="" type="text" name="pass" value="" />

            <input id="submit" type="submit" aftersubmit:"aftersubmit" value="" />
        </form>
        <script type="text/javascript">
             $.cy={
                 aftersubmit:function(){
                     //...原来的done
                 }

             }

             //----------------------变成<script src="" type="text/javascript" charset="utf-8">
             $("[validation]").each(function(){
                 $(this).validation({
                     //...
                 })
             })

             $("form[ajax]").each(function(){
                 var submit=$(this).find("[type=submit]"),url=$(this).attr("ajax"),
                 formdata=$(this).serializeJSON(),fnName=submit.attr("aftersubmit");
                 var fn= $.cy[fnName];
                 submit.on("click",function(){
                     $.ajax(url,formdata).done(fn)
                 })

             })
        </script>

简单来说定义一个作用域,而所解析的所有html都会从此作用域中获取数据,

污染html是必须的,html的属性会爆炸式的增长,像原生的一样使用,很适合有初恋情怀的你

时间: 2024-10-08 23:33:15

原生与组件的相关文章

React Native 调用原生Android组件

在如今的App中,已经有成千上万的原生UI部件了--其中的一些是平台的一部分,另一些可能来自于一些第三方库,而且可能你自己还收藏了很多.React Native已经封装了大部分最常见的组件,譬如ScrollView和TextInput,但不可能封装全部组件.而且,说不定你曾经为自己以前的App还封装过一些组件,React Native肯定没法包含它们.幸运的是,在React Naitve应用程序中封装和植入已有的组件非常简单. 比如WebView,官方并没有提供Android端的实现,那么我们现

Android React Native使用原生UI组件

Android React Native 已经将几个常用的原生组件进行了封装,比如 ScrollView 和 TextInput,但是并不是所有系统的原始组件都被封装了,因此有的时候我们不得不自己动手封装一下,从而能够使用那些React Native没有为我们封装的原生组件,比如WebView,官方并没有提供Android端的实现,那么我们现在就动手封装一下WebView. 之前写过一篇文章Android React Native使用原生模块,而使用原生UI组件的方法和使用原生模块的方法十分类似

【原生JS组件】javascript 运动框架

大家都知道JQuerry有animate方法来给DOM元素进行运动,CSS3中也有transition.transform来进行运动.而使用原生的Javascript来控制元素运动,需要写很多运动的细节以及兼容. 然而,当你的BOSS不让你使用庞大的JQ框架,而且你开发的产品也需要在一些不兼容CSS3的浏览器运行的时候,你是否觉得每次都要开个定时器来琢磨运动该怎么进行,是件很费力的事情呢? 那么福利来了,笔者最近总结了两个常用的运动框架,并将其写成组件, 只要按照下面的方法调用,即可方便使用.

react native 使用 iOS 原生 UI 组件

目前 react native 的组件还是不多,有些也并不怎么好用,这时候就需要封装原生 UI 组件了 之前写过RN 与 native 的通信 无非就是两种: 1>>>  react native 内部事件需要通知 native 调用 native 的方法(或者传递RN 中的数据到 native),这时候可以用新建一个 manager 之类的文件 RCT_EXPORT_MOUDLE() 暴露 native类  ,RCT_EXPORT_METHOD () 暴露 native 方法给 js

es6 实现原生select组件,只用于学习,有哪些不足请指出

select 组件效果   这里不废话了直接上代码 HTML结构和select组件样式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <met

Sprinboot中使用JPA及简单的原生分页组件

一.POM.xml文件配置   <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <

纯原生组件化-模块化的探索

纯原生的组件化.模块化的一次小小的尝试,用到了如下几个新特性:shadown-DOM 对HTML标签结构的一个封装,真正意义上的组件,能保证 shadow-DOM 中的DOM元素不会被外界影响,内部也不会影响到外部的行为,变成了一个独立的模块.custom-elements 可以在浏览器中注册自定义的标签来使用,类似这样的效果<my-tag></my-tag>,标签内容基于两种形式:1. 普通子元素 2. shadow-DOMcustom-events 使用各种自定义事件辅助完成组

小程序 video 层级,原生组件

原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上. 后插入的原生组件可以覆盖之前的原生组件. 原生组件还无法在 scroll-view.swiper.picker-view.movable-view 中使用. 部分CSS样式无法应用于原生组件,例如: 无法对原生组件设置 CSS 动画 无法定义原生组件为 position: fixed 不能在父级节点使用 overflow: hidden 来裁剪原生组件的显示区域 原生组件的事件监听不能使用 bi

angular2 学习笔记 ( Component 组件)

ng2 的组件和游览器原生的组件是同一个概念,在方方面面都很相似. 和 ng1 一样,组件少不了数据绑定 1. model to view 绑定 (单向绑定, 意思是这个值应该是只读的, 组件内部不一样修改这个值) template: ` <my-product [model-to-view-value]="'Derrick' + 'Yam'" ></my-product> ` @Input("model-to-view-value") //