当前位置:首页 » 《随便一记》 » 正文

前端实现以及个人理解

17 人参与  2024年05月01日 16:23  分类 : 《随便一记》  评论

点击全文阅读


前言

        这回从前端文本基础实现讲解开始,到前端本人使用过的一些框架进行简单说明,技术方面不会深讲,工作经验没多少,主要还不是固定一个方向深耕,本人一直觉得很慌,虽说领导给定的方向是全栈,但还是担心是饼,但有个方向总比没有好,工作内方向又不是自己能决定的,难啊!

        水够字数了,将从HTML页面的基础要素讲起,本人接触过的框架thymeleaf,vue2,angular,react,vue3会多少讲一点,后面用到了更深层次,或者更好用的技术,再更新吧。

HTML页面要素

        打开F12,浏览器自带的开发者工具,点击元素,我们会看到html下有主要有三部分,(1)、<head></head>标签下代表的引用文件样式(.css或者样式预处理文件.scss)<style>直接写在标签内亦可,页面可声明元信息<meta>,<title>标题<link>连接文件等

(2)、页面要素标签集合,<body></body>主体,<div></div>分区,<menu></menu>菜单,<hi></hi>标题,<img>图片,<table></table>表格,<button></button>按钮,<pagination></pagination>分页栏,<footer></footer>页脚等等,不详细介绍了,开发者工具右边样式栏里有标签对应各种显示属性,详细看教程,百度菜鸟教程自己看

(3)、引用的JavaScript(.js文件)或者Typecript(.ts)功能实现文本<script>,typescript对变量,功能等有类型定义,注重类型安全,js中var和let几乎能定义完,但出问题调试很困难,在源代码处找对应文件,对应行单击即可打上断点,鼠标停留在上面即可看运行到断点处的变量或者结构详细,确实比后端调试方便。

框架

        这里先说明一下,thymeleaf和angularjs仍旧是多页面式的框架,使用多个HTML页面,但vue和react是单页面响应式框架,只有一个根页面App.vue或者index.html作为根页面,然后定义路由组件包含所有页面,响应速度十分快。

        此外,react是讲HTML页面标签元素视为为一个函数返回值,代码更加容易得到复用,能够很好的应用在大项目的开发中,vue是另外定义了<template></template>标签存放html页面标签元素,下方<script></script>标签存放功能,<style><style>存样式响应更快。

        另外两个的使用场景呢?thymeleaf是springboot自带的用来替代JSP的模板引擎,非分离式开发,存放在resource的template下,数据量大的情况下,比单个页面全部请求快很多,后端有大批量数据需要展示的情况下使用它;AngualarJs是一个类 MVC 类结构的 JavaScript 单页面应用框架,建议构建 CRUD 类型应用的时候使用它,而对于那些图形编辑、游戏开发等应用,使用 Angular 就不如调用其它 JavaScript 类库方便,如 jQuery,Vue 不包含路由器,HTTP 请求服务等。开发者必须安装所需的“插件”,angular却有,有助于节省编码时间。

ThymeLeaf

        说真的,感觉没多少好讲的,数据绑定方式是属性后@{}绑定方法,*{}绑定对象,${}绑定值,嫌麻烦queryselector()直接绑定就行,没多少自带文件结构,在resource下定义首页,直接加标签就行;主要是UI库,根据UI库官网给的组件,直接往上套就行,我用的是layUI,同时甚至支持其他框架。

vue

文件结构:

1、build:构建脚本目录

2、config:项目配置

3、node_modules:npm 加载的项目依赖模块
4、src:这里是我们要开发的目录,基本上要做的事情都在这个目录里。里面包含了几个目录及文件:
1)assets:资源目录,放置一些图片或者公共js、公共css。但是因为它们属于代码目录下,所以可以用 webpack 来操作和处理。意思就是你可以使用一些预处理比如 Sass/SCSS 或者 Stylus。
2)components:用来存放自定义组件的目录,目前里面会有一个示例组件。
3)router:前端路由目录,我们需要配置的路由路径写在index.js里面;
4)App.vue:根组件;这是 Vue 应用的根节点组件,往下看可以了解更多关注 Vue 组件的信息。
5)main.js:应用的入口文件。主要是引入vue框架,根组件及路由设置,并且定义vue实例,即初始化 Vue 应用并且制定将应用挂载到index.html 文件中的哪个 HTML 元素上。通常还会做一些注册全局组件或者添额外的 Vue 库的操作。                                                                                    6)store:存储文件,将全局变量、异步变量、状态管理之类的存放
5、static:静态资源目录,如图片、字体等。不会被webpack构建
6、index.html:首页入口文件,可以添加一些 meta 信息等。 这是应用的模板文件,Vue 应用会通过这个 HTML 页面来运行,也可以通过 lodash 这种模板语法在这个文件里插值。 注意:这个不是负责管理页面最终展示的模板,而是管理 Vue 应用之外的静态 HTML 文件,一般只有在用到一些高级功能的时候才会修改这个文件。
7、package.json:npm包配置文件,定义了项目的npm脚本,依赖包等信息
8、README.md:项目的说明文档,markdown 格式

vue2和vue3有些区别:
vue2vue3
双向数据绑定实现原理APIobject.defineProprty()挟持数据API代理
碎片(多个根节点)不支持支持,login->loginForm
API类型选项类型data,components,methods合成类型components,setup()
数据变量和方法定义data{},methods{},computed{}reactive()响应数据,setup()返回数据
生命周期函数create()替代为setup()
父传子值父props传子用this.$emit父传子setup()参数列表里content参数
指令和插槽slot直接用,v-for级别最高,v-if不建议一起使用v-slot,命令间不起冲突,无v-on,filter
main.js可用protype,引入构造函数引入工厂函数,无跟标签

编写.vue文件要注意以上这些

生命周期函数说明:

创建期间的生命周期函数:
                beforeCreate:实例初始化后调用,此时实例刚在内存中创建出来,data和methods还没初始化好。
                created:在实例创建完成后被立即同步调用,实例已在内存中创建好,data和methods已初始化好,此时还没开始编译模板。
                beforeMount:在挂载开始之前被调用,已完成模板编译,还没挂载到页面上。
                mounted:实例被挂载后调用,已将编译好的模板挂载到页面指定的容器中显示。
        运行期间的生命周期函数:
                beforeUpdate:状态更新前调用,此时data中的值是最新的,但界面上数据还是旧的,还没开始重新渲染DOM节点。
                updated:实例更新完调用,此时data中的值和界面显示的数据都已更新完成,界面已被重新渲染完成。
        销毁期间的生命周期函数:
                beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。
                destroyed:实例销毁后调用。该钩子被调用后,对应 Vue 实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。

都是在<script>里methods:接口里定义行为。

        具体实现参考UI库,我用的是elementUI,router安装后,可调用路由服务,在router文件夹下import就是了,然后属性指定,子组件component直接指定路径下对应文件,访问认证记得写在这里。

        优化点是lazyload()延时加载长,因为是单页面吗,预加载的话时间太长,半天进不去体验就很差,可在main.js里指定对应参数,亦可在指定标签用v-lazy指令,component可用箭头函数import,后端在application.properties里调用gzip压缩指定文件,效果最明显

gzip on; # 开启Gzip

gzip_static on; # 开启静态文件压缩

gzip_min_length 1k; # 不压缩临界值,大于1K的才压缩

gzip_buffers 4 16k;

gzip_http_version 1.1;

gzip_comp_level 2;

gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; # 进行压缩的文件类型

gzip_vary on;

gzip_proxied expired no-cache no-store private auth;

gzip_disable "MSIE [1-6]\.";

        最后,在config.js里做proxy代理到后端就行

AngualrJs

文件结构:

app/  

-----config/

----- controllers/  

---------- mainController.js  

---------- otherController.js  

----- directives/  

---------- mainDirective.js  

---------- otherDirective.js  

----- services/  

---------- userService.js  

---------- itemService.js  

----- js/  

---------- bootstrap.js  

---------- jquery.js  

----- app.js  

views/  

----- mainView.html  

----- otherView.html  

----- index.html

        说实话,这个玩意儿是我接触最少的,就做了一个页面和一个页面的优化,唯一有点印象的就是他的MVC模式,v就是view,视图这个不用多说,把html文件放进去views就行,指令绑定,ng-;c就是控制器,把实现的js文件放进去controllers,调度定义在service指定后端服务,有点印象的是它有作用域的概念,$rootscope,定义获取全页面变量,$scope只定义获取当前页面变量,然后.moudule绑定到指定模块,.controller绑定到自定义的controller,config里.state指定模块,属性url和views指定视图,resolve指定控制器文件

react

        这个框架与vue结构基本一致:

项目目录:
├─node_modules        //第三方依赖
├─public            //静态资源(不参与打包)
└─src
    ├─assets        //静态资源
    ├─components    //组件
    ├─config        //配置
    ├─http            //请求方法封装
    ├─layout        //页面布局
    ├─pages            //页面
    ├─routes        //路由
    ├─service        //请求
    ├─redux            //状态管理
    └─util            //通用方法
    └─App.css
    └─App.tsx
    └─index.css
    └─main.tsx
    └─vite-env.d.ts
├─.eslinttrc.cjs
├─.gitignore        
├─index.html        //项目页面总入口
├─package.json    
├─tsconfig.json        //ts配置文件
├─tsconfig.node.json
├─vite.config.ts    //vite配置文件
 

主要是用了TypeScript实现,typeScript建议看教程学,菜鸟教程搜就是,redux代替了store来存全局变量、异步变量、状态管理之类的数据,UI用的是TinyUI,练习用antd吧,毕竟那个官网要在华为内网内才能看。

react关键点在useState()和useEffect():

let [count,setCount] = useState(10) 定义变量和自带的修改方法,

useEffect():

第一种情况:只有一个回调函数参数相当于didMount+didUpdate,并且可以有返回值的;

return 返回是一个钩子函数相当于 willUnmount卸载钩子;

第二种请求 参数1是箭头回调函数,参数2是空数组,相当于didMount 但是只初始化执行一次;

第三种情况 参数1是箭头回调函数 参数2是数组的元素是状态,在初始化走一次,监听第二个参数中的发生变化时候走一次;

// 只有参数1箭头函数回调
    useEffect(()=>{
        console.log("1-didMount+didUpdate")
        // 可以在此处发请求和获取DOM ,但是数据更新的话会再次执行
        ref1.style.color="red" //成功更改颜色
        return ()=>{
            // 可以清除定时器等
            console.log("相当于 willUnmount卸载钩子")
        }
    })
 
    // 参数2为空数组,只会在第一次绑定dom元素执行一次,相当于didMount
    useEffect(()=>{
        console.log("2-didMount")
        // 可以在此处发请求和获取DOM
    },[])
 
    // 参数2数组不为空,数组元素的是一个状态,类似于watch监听到count变化的时候调用
    // 初始化也会走一次,目的为了指定监听谁的
    // 监听属性发生变化的时候, 也会触发改钩子
    useEffect(()=>{
        console.log("3---监听第二个数组中的状态")
    },[count])
    return(
            <div>
                <h3 ref={el=>ref1=el}>{count}</h3>
                <button onClick={()=>{
                    setCount(999999)
                }}
                >修改count</button>
 
                <h3>{person.name}</h3>
 
                <button onClick={()=>{
                    setPerson({
                        name:"zs"
                    })
                }}
                >修改Person</button>
            </div>
    )

生命周期:

Mounting(挂载):已插入真实 DOMUpdating(更新):正在被重新渲染Unmounting(卸载):已移出真实 DOM

后端代理在vite.config.ts里。

后言

        看完还是觉得捞的不行,没项目干说太蛋疼,更像是个人感悟,谁不想直接跟着项目走一遍加深印象和理解呢,我就搬下大佬们的文章吧,react ,vue,angularJs,至于你问我为啥没有thymeleaf。只能说太旧了,我接手时领导找了两老员工都半天解决不了问题,只能期望于你别接手相关项目,现在前后端不分离的web项目太少见了,还不如祈求后端优化少传点数据。后端以后再说吧,感觉完全是另一个思路,毕竟抛异常,调试定位就有的头疼了,更别说各种技术,我以后看看能不能就一个框架springboot,毕竟也只接触过这一个,加上一些技术说明,前端其实好多也没说到,例如请求axios,navigate等等,后面再扩充或者另起文章讲吧。


点击全文阅读


本文链接:http://www.zhangshiyu.com/post/102695.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1