前端工程化03-贝壳找房项目案例JavaScript常用的js库

news2024/11/24 0:33:45

4、项目实战(贝壳找房)

这个项目包含,基本的ajax请求调用,内容的渲染,防抖节流的基本使用,ajax请求工具类的封装

4.1、项目的接口文档

下述接口文档:

简述内容
baseURL:http://123.207.32.32:9060/beike/api
首页数据(GET):baseURL + /homePageInfo
搜索接口(GET):baseURL + /sug/headerSearch?cityId=440100&cityName=广州&channel=site&keyword=白云山&query=白云山
热门推荐(GET):baseURL + /site/rent
城市数据(GET):baseURL + /city

详细接口文档,见如下资料:HYBeiKe接口文档.md

4.2、为什么要封装Ajax请求库

//文档加载完成以后再进行dom操作
$(function(){
    //1、拿到我们首页的一个数据
    $.ajax({
        //1.1、不会出现跨域问题、后台配置跨域  node cors   nginx反向代理
        url: "http://123.207.32.32:9060/beike/api/homePageInfo",
        type: "get",
        dataType: "json",
        success: function(data){
           console.log(data)
           //1.2、更新左上角的地址信息
           var  addr=data.curLocation || {}
           console.log(addr.city)
           $(".header .address").text(addr.city)
        },
        error: function(err){
            console.log(err)
        }
    })
})



/**
 * 为什么要封装
 *   1、可扩展性、可维护性
 *   2、封装性:可以对我们共性代码进行封装,baseURl,timeOut(解耦合)
 *   3、统一处理我们的请求(前置拦截请求:放token、后置拦截请求:解构data数据,异常拦截处理:统一弹出错误提示)
 */

image-20240421151222548

代码封装的工具类request.js文件

;(function(window, $) {
  function request(config) {
    // 返回一个Promise
    return $.ajax({
      timeout: config.timeout || 5000,
      url: config.url || '',
      method: config.method || 'GET',
      data: config.data || {},
      headers: config.headers || {}
      //后面的会把前面的覆盖掉
      //...config 
    })
  }
 
  function get(url, data = {}, config = {}) {
    // 返回一个Promise
    return request({
      url,
      method: 'GET',
      data,
      ...config
    })
  }

  function post(url, data = {}, config = {}) {
    return request({
      url,
      method: 'POST',
      data,
      ...config
    })
  }


  window.HyReq = {
    request,
    get,
    post
  }
//立即执行函数
})(window, jQuery)

4.3、代码风格

$(function(){
    //0.初始化页面需要执行的函数
    initPage();
    
    function initPage(){
        //1.拿到首页的数据
        HyReq.get('http://123.207.32.32:9060/beike/api/homePageInfo')
        .then(function(res){
            console.log(res)
            //1.1、更新左上角的地址信息
            renderHeaderAddress(res);
        })
        .catch(function(err){
            console.log(err)
        });

    }

    //2.渲染头部的数据
    function renderHeaderAddress(res){
        //1.更新左上角的地址信息
        var  addr=res.curLocation || {}
        console.log(addr.city)
         $(".header .address").text(addr.city)
    }
})
const  BASE_URL='http://123.207.32.32:9060/beike/api/'

const  HYAPI={
    HOME_PAGE_INFO:BASE_URL+'homePageInfo', //获取首页的数据
    HOT_RECOMMEND:BASE_URL+'site/rent' //获取热门推荐数据
}

4.5、热门推荐

1、公用代码抽取

2、数据缓存优化

$(function(){
   
    // 常规变量
    var $searchInput=$(".header .house-search")
    var $searchList=$(".header .search-list")
    var $searchTips=$(".header .search-tips")
    // 缓存变量
    var cacheSearchListData=[];


    //1.初始化页面需要执行的函数
    initPage();

    function initPage(){
        //1.拿到首页的数据
        HyReq.get(HYAPI.HOME_PAGE_INFO)
        .then(function(res){
            console.log(res)
            //1.1、更新左上角的地址信息
            renderHeaderAddress(res);
        })
        .catch(function(err){
            console.log(err)
        });

    }

    //2.渲染头部的数据
    function renderHeaderAddress(res){
        //1.更新左上角的地址信息
        var  addr=res.curLocation || {}
        console.log(addr.city)
         $(".header .address").text(addr.city)
    }

    //3.监听房子搜索输入框的focus事件
    $searchInput.on("focus",function(){
        //判断缓存是否有数据
        if(cacheSearchListData.length){
            //渲染界面
            renderSearchList(cacheSearchListData);
            return;
        }
        //1、发起网络请求,获取热门推荐的数据
        HyReq.get(HYAPI.HOT_RECOMMEND)
        .then(function(res){
            //获得数据赋值变量值
            var searchListData=res.rent_house_list.list||[];

            //判断是否有数据
            if(!searchListData){
                //没有数据直接返回
                return;
            }
            
            //复杂的数组映射成为一个简单的数组(map映射,并不会改变原数组)
            searchListData=searchListData.map((item)=>{
                return{title:item.app_house_title}
            })
            
            //有数据就处理下缓存
            cacheSearchListData=searchListData;
            //渲染页面结构
            renderSearchList(searchListData);
        })
    })
    
    //4、清空隐藏
    $searchInput.on('blur',function(){
        $searchList.empty()
        // $searchTips.css('display','none')
        // $searchList.hide();
    })

    //searchListData:[{title:'}]
    function renderSearchList(searchListData=[]){
        //渲染界面的
        var htmlString=`<li><span>热门搜索</span></li>`
        searchListData.forEach(function(item){
                 console.log(item);
                 htmlString+=`<li><span>${item.title}</span></li>`
        });
        //拼接给搜索列表
        $searchList.empty().append(htmlString)
    }

})

4.6、缓存防抖应用

用的是我们js高级手写的防抖节流库

function debounce(fn, delay = 500, immediate = false) {
  // 1.定义一个定时器, 保存上一次的定时器
  let timer = null
  let isInvoke = false

  // 2.真正执行的函数
  const _debounce = function(...args) {
    // 取消上一次的定时器
    if (timer) clearTimeout(timer)

    // 判断是否需要立即执行
    if (immediate && !isInvoke) {
      fn.apply(this, args)
      isInvoke = true
    } else {
      // 延迟执行
      timer = setTimeout(() => {
        // 外部传入的真正要执行的函数
        fn.apply(this, args)
        isInvoke = false
      }, delay)
    }
  }

  return _debounce
}

function throttle(fn, interval = 400, options = { leading: true, trailing: false }) {
  // 1.记录上一次的开始时间
  const { leading, trailing } = options
  let lastTime = 0
  let timer = null

  // 2.事件触发时, 真正执行的函数
  const _throttle = function(...args) {

    // 2.1.获取当前事件触发时的时间
    const nowTime = new Date().getTime()
    if (!lastTime && !leading) lastTime = nowTime

    // 2.2.使用当前触发的时间和之前的时间间隔以及上一次开始的时间, 计算出还剩余多长事件需要去触发函数
    const remainTime = interval - (nowTime - lastTime)
    if (remainTime <= 0) {
      if (timer) {
        clearTimeout(timer)
        timer = null
      }

      // 2.3.真正触发函数
      fn.apply(this, args)
      // 2.4.保留上次触发的时间
      lastTime = nowTime
      return
    }

    if (trailing && !timer) {
      timer = setTimeout(() => {
        timer = null
        lastTime = !leading ? 0: new Date().getTime()
        fn.apply(this, args)
      }, remainTime)
    }
  }

  return _throttle
}

在jq库下导入

<script src="./js/utils.js"></script>

实战代码

$(function(){
   
    // 常规变量
    var $searchInput=$(".header .house-search")
    var $searchList=$(".header .search-list")
    var $searchTips=$(".header .search-tips")
    var $searchMenu=$('.header .search-menu > ul')
    var $searchMenuArrow=$('.header .arrow')
 
    //首页的所有数据
    var homePageInfoData={} //首页的所有的数据
  
    //搜索框提示内容
    var currentSearchPlaceHolder='请输入区域、商圈或小区名开始找房'
    // 缓存变量
    var cacheSearchListData=[];
   
    //渠道全局变量
    var currentSearchBarSelector='site';

    //1.初始化页面需要执行的函数
    initPage();
    function initPage(){
        //1.拿到首页的数据
        HyReq.get(HYAPI.HOME_PAGE_INFO)
        .then(function(res){
            //0、把首页数据存起来
            homePageInfoData=res;
            //1、更新左上角的地址信息
            renderHeaderAddress(res);
            //2、渲染搜索栏
            renderSearchBar(res);
        })
        .catch(function(err){
            console.log(err)
        });

    }

    //2.渲染头部的数据
    function renderHeaderAddress(res){
        //1.更新左上角的地址信息
        var  addr=res.curLocation || {}
         $(".header .address").text(addr.city)
    }

    //3.监听房子搜索输入框的focus事件
    $searchInput.on("focus",function(){
        
        //1、如果 input 有数据因该去搜索
        var  value=$(this).val()
        if(value.trim()){
            //去搜索房子(通过代码模拟一个用户输入事件)
            $(this).trigger('input')
            return;
        }
        //2、如果没有数据就是热门推荐
        

        //判断缓存是否有数据
        if(cacheSearchListData.length){
            //渲染界面
            renderSearchList(cacheSearchListData);
            return;
        }
        //1、发起网络请求,获取热门推荐的数据
        HyReq.get(HYAPI.HOT_RECOMMEND)
        .then(function(res){
            //获得数据赋值变量值
            var searchListData=res.rent_house_list.list||[];

            //判断是否有数据
            if(!searchListData){
                //没有数据直接返回
                return;
            }
            
            //复杂的数组映射成为一个简单的数组(map映射,并不会改变原数组)
            searchListData=searchListData.map((item)=>{
                return{title:item.app_house_title}
            })
            
            //有数据就处理下缓存
            cacheSearchListData=searchListData;
            //渲染页面结构
            renderSearchList(searchListData);
        })
    })
    
    //4、清空隐藏
    $searchInput.on('blur',function(){
        $searchList.empty()
        // $searchTips.css('display','none')
        // $searchList.hide();
    })

    //5、搜索列表渲染 searchListData:[{title:'}]
    function renderSearchList(searchListData=[]){
        //渲染界面的
        var htmlString=`<li><span>热门搜索</span></li>`
        searchListData.forEach(function(item){
            htmlString+=`<li><span>${item.title}</span></li>`
        });
        //拼接给搜索列表
        $searchList.empty().append(htmlString)
    }
    
    //6、列表输入搜索   debounce防抖函数
    $searchInput.on('input',debounce(
        function(){
          //转jq对象,拿到val
          var value=$(this).val();
          // url?key=value 
          // data:{}  转查询字符串,放到url

          //取首页数据
           var curLocation=homePageInfoData.curLocation
           HyReq.get(HYAPI.HOME_SEARCH,{
            cityId:curLocation.cityCode,   
            cityName:curLocation.city,   
            channel:currentSearchBarSelector,   
            keyword:value, 
            query:value	
           }).then(function(res){
            console.log(res);
            //获取赋值给变量
            var  searchData=res.data.result||[]
            //将复杂的数组转换为简单的数组
            searchData=searchData.map((item)=>{
                return{title:item.hlsText||item.text}
            })
            //渲染列表
            renderSearchList(searchData);
          })
       })
    )


    //7、箭头移动事件监听
    $searchMenu.on('click','li',function(){
        console.log(this)
        //1、修改li的高亮
        var $li=$(this)
        $li.addClass('active').siblings().removeClass('active');
        //2、移动箭头
        var liWidth=$li.width();
        var position=$li.position();
        // console.log(liWidth)
        // console.log(position)
        var arrowLeft =position.left+(liWidth/2)
        $searchMenuArrow.css('left',arrowLeft)

        //3、修改我们的placholder
        $searchInput.prop({
            placeholder:currentSearchPlaceHolder+$li.text()
        })

        //4、拿到li中绑定的key
        console.log($li.data('key'))
        currentSearchBarSelector=$li.data('key')
    })

    //8、渲染搜索栏数据
    function renderSearchBar(res){
        var  searchBarData=res.searchMenus||[];
        var  stringHtml='';
        searchBarData.forEach(function(item,index){
            var active=index===0?'active':'';
            stringHtml+=`<li class="item ${active}" data-key="${item.key}"><span>${item.title}</span></li>`

        })
        $searchMenu.empty().append(stringHtml)
    }

})

5、常用的JavaScript的库

jQuery是一个快速、小型且功能丰富的 JavaScript 库,它使HTML文档遍历和操作、事件处理、动画和 AJAX 之类的事情变得更加简单。当时jQuery库不但简化了代码,而且提供出色的跨浏览器支持,其极大的提高了 Web 开发人员的工作效率。 除了jQuery之外,其实还有许多库和框架可供JavaScript开发人员使用。下图是前端开发常用的工具库:

image-20240502192637856

5.1、underscore库 VS Lodash

Lodash Underscore 都是非常实用JavaScript工具库,它们都提供了非常多的函数来对数字字符串数组对象等操作。

这些函数不但可以简化JavaScript编写,而且可以极大的提高我们的开发效率。这些库非常适合如下操作:

  • 迭代数组、对象和字符串。
  • 操作和测试值。
  • 创建复合函数。

LodashUnderscore的一个分支,仍然遵循Underscore的API, 但在底层已完全重写过。对于字符串、数组、对象等Lodash提供了跨环境迭代的支持。

Lodash还添加了许多Underscore没有提供的特性和功能,例如:提供 AMD 支持深度克隆深度合并更好的性能大型数组和对象迭代的优化等,如今的Lodash足以成为Underscore替代品。

Lodash从第4个版本开始放弃对IE9以下的支持。

image-20240502193516496

5.2、Lodash库的安装

方式一:CND

https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js

方式二:下载源码引入

<!--1、本地源码引入(会在全局的window中添加 _ 变量-->
<script src="../libs/lodash.min.js"></script>
<script>
    console.log(window._)
    //去除假值
    console.log(_.compact([1,2,3,false,null]))
</script>

5.3、Lodash库的基本使用

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script src="./utils/HYLodash.js"></script>
  <script>
    // 1.打印一下 _
    console.log("%O", _)
    console.log(_.VERSION) // 查看Lodash的版本号

    console.log(_.join([2022, 06, 23], '-'))
    
  </script>
</body>
</html>

5.4、手写一个精简版的Lodash

HYLodash.js

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script src="./utils/HYLodash.js"></script>
  <script>
    // 1.打印一下 _
    console.log("%O", _)
    console.log(_.VERSION) // 查看Lodash的版本号

    console.log(_.join([2022, 06, 23], '-'))
    
  </script>
</body>
</html>

参考官网文档

https://www.lodashjs.com/docs/lodash.random

5.5、Lodash-number的操作

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script src="./libs/lodash-4.17.21.js"></script>
  <script>
    // 1.获取随机数
    console.log( _.random(5)  )  // 0-5
    console.log( _.random(5, 10)  )  // 5 - 10
  </script>
</body>
</html>

5.6、Lodash-string的操作

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script src="./libs/lodash-4.17.21.js"></script>
  <script>
    // 1.将字符串转成 驼峰命名 中间的空格会去掉
    console.log( _.camelCase(' foo bar  ')  )
    // 2.转驼峰,并忽略掉---
    console.log( _.camelCase('--foo-bar--')  )
    // 3.首字母大写,前面有空格,去不掉,中间有空格,也去不掉
    console.log( _.capitalize('foo bar') )
    // 4.判断字符串是否以某个字符串结尾
    console.log(_.endsWith('logo.jpeg', '.png') )
    // 5.字符串填充,希望长度为2,不够就填充0,填充到你制定的长度
    console.log(_.padStart('9', 2, '0'))   // 1 -> 01
    
    
  </script>
</body>
</html>

5.7、Lodash-array的操作

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script src="./libs/lodash-4.17.21.js"></script>
  <script>
    var obj = {}
    var colors = ['red', 'red', obj, obj,  'green', 'blue', ['orange', 'pink'] ]

    // 1.数组去重
    // console.log( _.uniq(colors) )

    // 2.扁平化
    // console.log( _.flatten(colors) )

    // 2.去除数组中假的值
    console.log( _.compact( [1, 2, {}, '', 0, null, undefined, false, 'red'] ) )
    
  </script>
</body>
</html>

5.8、Lodash-object的操作

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script src="./libs/lodash-4.17.21.js"></script>
  <script>
    var user = {
      name: 'liujun',
      age: '17',
      height: '1.66',
      friends: [
        'Evan',
        'John',
        'Mark',
        'Jack',
        'David'
      ]
    }

    
    // console.log( _.pick(user, ['name', 'friends']) )
    // console.log( _.omit(user, ['name', 'friends']) )

    // console.log( _.clone(user) )
    console.log( _.cloneDeep(user) )  // 深拷贝

    
  </script>
</body>
</html>

5.9、Lodash-object的操作

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script src="./libs/lodash-4.17.21.js"></script>
  <script>
    var user = {
      name: 'liujun',
      age: '17',
      height: '1.66',
      friends: [
        'Evan',
        'John',
        'Mark',
        'Jack',
        'David'
      ]
    }

    // 浅拷贝(祖宗变孩子也跟着变)--我只想拷贝部分属性
    // console.log( _.pick(user, ['name', 'friends']) )
    
    // 浅拷贝(排除name,friends,其他的我都要)
    // console.log( _.omit(user, ['name', 'friends']) )
    
    // 浅拷贝(克隆user())
    // console.log( _.clone(user) )

    // 深拷贝
    console.log( _.cloneDeep(user) )  // 深拷贝
    
  </script>
</body>
</html>

工作中,比如我们需要写防抖、需要写节流、需要函数的柯里化、我们就不需要再耗费很多的时间在去写这个东西、我们直接采用一个库就能解决

5.1、Moment.js库 VS Day.js

  • Moment库,官网的描述
    • Moment 是一个 JavaScript 库,可以帮助我们快速处理时间和日期,已在数百万的项目中使用。
    • Moment对浏览器的兼容性比较好,例如,在Internet Explorer 8+版本运行良好。
    • 现在比较多人反对使用 Moment是因为它的包大小。Moment 不适用于“tree-shaking”算法,因此往往会增加 Web 应用程序包的大小。如果需要国际化或时区支持,Moment 可以变得相当大。
    • 现在比较多人反对使用 Moment是因为它的包大小。Moment 不适用于“tree-shaking”算法,因此往往会增加 Web 应用程序包的大小。如果需要国际化或时区支持,Moment 可以变得相当大。
  • Day.js库,官网的描述:
    • Day.js 是 Moment的缩小版。Day.js 拥有与 Moment相同的 API,并将其文件大小减少了 97%。
    • Moment完整压缩文件的大小为 67+Kb,Day.js 压缩文件只有 2Kb。
    • Day.js所有的 API 操作都将返回一个新的Day.js对象,这种设计能避免 bug 产生,减少调试时间。
    • Day.js 对国际化支持良好。国际化需手动加载,多国语言默认是不会被打包到Day.js中的。
  • tree-shaking算法
    • 打包的时候就不把那些没有用到的函数打包到我们的引用程序中,像一个棵树把枯萎的叶子摇掉一样

5.2、Day.js库安装

方式一:CND

https://unpkg.com/dayjs@1.8.21/dayjs.min.js

<!--CDN example (unpkg)-->
<script src="https://unpkg.com/dayjs@1.8.21/dayjs.min.js"></script>

方式二:下载源码引入

<script src="path/to/dayjs/dayjs.min.js"></script>
<script>dayjs().format()</script>

image-20240503003056232

5.3、Day.js初体验

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <!-- 
    window.dayjs = 工厂函数
   -->
  <script src="./libs/dayjs.js"></script>
  <script>
    // console.log("%O", dayjs)
    console.log("%O", dayjs()) // 创建 dayjs 对象
    console.log(dayjs().format()) // 拿到当前的时间
    
  </script>

</body>
</html>

5.4、手写精简版的Day.js

(function(g){
    g = typeof globalThis !== 'undefined' ? globalThis : g || self;
 
    // 构造函数
    function Dayjs(dateString) {
        if (dateString) {
            var parsedDate = new Date(dateString);
            if (isNaN(parsedDate.getTime())) {
                throw new Error('Invalid date format');
            }
            this.$Y = parsedDate.getFullYear();
            this.$M = parsedDate.getMonth();
            this.$D = parsedDate.getDate();
        } else {
            var currentDate = new Date();
            this.$Y = currentDate.getFullYear();
            this.$M = currentDate.getMonth();
            this.$D = currentDate.getDate();
        }
    }
 
    // 格式化日期
    Dayjs.prototype.format = function(formatString = 'YYYY-MM-DD') {
        const year = this.$Y;
        const month = (this.$M + 1).toString().padStart(2, '0');
        const day = this.$D.toString().padStart(2, '0');
 
        return formatString.replace(/YYYY/g, year)
                            .replace(/MM/g, month)
                            .replace(/DD/g, day);
    }
 
    // 工厂函数
    function dayjs(dateString) {
        return new Dayjs(dateString);
    }
 
    // 原型链处理
    dayjs.prototype = Object.create(Dayjs.prototype);
    dayjs.prototype.constructor = dayjs;
 
    // 导出
    g.dayjs = dayjs;
})(this);

使用自定义的day.js

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script src="./utils/HYDayjs.js"></script>
  <script>
    console.log("%O", dayjs)
    console.log("%O", dayjs()) // 创建 Dayjs 对象
    console.log(dayjs().format()) // 拿到当前的时间

  </script>
</body>
</html>

5.5、Dayjs-获取和设置时间

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script src="./libs/dayjs.js"></script>
  <script >

    // 1.拿到Dayjs的对象
    // var day = dayjs()
    // 获取时间
    // console.log(day.year(), (day.month() + 1), day.date(), day.hour(), day.minute(), day.second())

    // 2.设置时间
    var day = dayjs()
              .year(2021)
              .month(5)
              .date(1)
    console.log(day.year(), (day.month() + 1), day.date(), day.hour(), day.minute(), day.second())
  </script>
</body>
</html>

5.6、Dayjs-时间操作

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script src="./libs/dayjs.js"></script>
  <script>
    // 1.增加一天
    var day = dayjs() // dayjs 对象
              // .add(1, 'year') // 增加一年
              // .add(2, 'month') // 增加2个月
              // .add(-1, 'month') // 减去一个月

              // .subtract(1, 'year')  // 减去一年
               // .subtract(1, 'month')
              // .subtract(1, 'day') 

              // .startOf('year')  // 一年的开始 2022-01-01 00:00:00
              // .startOf('month')  // 
              // .startOf('day')  //


    // 时间的格式化
    console.log( day.format("YYYY-MM-DD HH:mm:ss") )

  </script>
</body>
</html>

5.7、Dayjs-时间解析

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script src="./libs/dayjs.js"></script>
  <script>
    // 1.解析一个字符串(ISO 8601)类型的时间
    // YYYY-MM-DD HH:mm:ss
    // YYYY-MM-DD
    // YYYY/MM/DD
    // var day = dayjs('2021-2-2 12:00:10') // dayjs 对象

    // 2.解析时间戳(毫秒)
    // var day = dayjs(1656206934331) // dayjs 对象

    // 3.解析时间戳(秒)
    // var day = dayjs.unix( 1656206934 ) // dayjs 对象

    // 4.解析Date对象
    // var day = dayjs(new Date('2022-10-1')) // dayjs 对象
    
    // 时间的格式化
    // console.log( day.format("YYYY/MM/DD HH/mm/ss") )

  </script>
</body>
</html>

5.8、Dayjs-插件的使用

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
  <script src="./libs/dayjs.js"></script>
  <!-- 会在 Dayjs 的原型上添加: fromNow .... -->
  <script src="./libs/dayjs.relative-time.min.js"></script>
  <!-- 
    给给dayjs的全局变量 Ls 添加了一个中文支持
   -->
  <script src="./libs/dayjs.zh-cn.min.js"></script>

  <script>
    // 1.安装插件
    dayjs.extend(dayjs_plugin_relativeTime)
    // 2.切换使用中文
    dayjs.locale('zh-cn')

    // 1. 1小时   5分钟   2天前
    var day = dayjs(1656206934331) // dayjs 对象

    console.log(day.fromNow())


  </script>
</body>
</html>

5.9、DayJs-国际化

当提到 Day.js 或任何日期时间库的“国际化”功能时,它确实指的是根据不同国家或地区的习惯来表示日期和时间。这包括但不限于日期的书写顺序(例如,是“月/日/年”还是“日/月/年”)、使用的语言(如英文的“January”对应中文的“一月”)、以及时间格式(12小时制与24小时制)等。

通过国际化功能,开发者能够确保应用程序中的日期和时间信息能被全球各地的用户准确理解和识别,提升了用户体验,特别是在构建多语言版本的网站或应用时尤为重要。Day.js 通过切换locale(地区语言设置)来实现这一点,确保日期和时间的展示符合用户的地区文化期望。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1640177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macOS sonoma 14.4.1编译JDK 12

macOS sonoma 14.4.1编译JDK 12 环境参考文档开始简述问题心路历程着手解决最终解决(前面有点啰嗦了&#xff0c;可以直接看这里) 记录一次靠自己看代码解决问题的经历(总之就是非常开心)。 首先&#xff0c;先diss一下bing&#xff0c;我差一点就放弃了。 环境 macOS sonom…

excel怎么删除条件格式规则但保留格式?

这个问题的意思就是要将设置的条件格式&#xff0c;转换成单元格格式。除了使用VBA代码将格式转换外&#xff0c;还可以用excel自己的功能来完成这个任务。 一、将条件格式“留下来” 1.设置条件格式 选中数据&#xff0c;点击开始选项卡&#xff0c;设置条件格式&#xff0…

2024五一数学建模C题煤矿深部开采冲击地压危险预测原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024五一数学建模竞赛C题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 2024五一数学建模C题完整原创论文讲解&#xff0c;手把手保姆级教学&#xff01;_哔哩哔哩_bilibili 202…

移动机器人系统与技术:自动驾驶、移动机器人、旋翼无人机

这本书全面介绍了机器人车辆的技术。它介绍了道路上自动驾驶汽车所需的概念。此外&#xff0c;读者可以在六足机器人的构造、编程和控制方面获得宝贵的知识。 这本书还介绍了几种不同类型旋翼无人机的控制器和空气动力学。它包括各种旋翼推进飞行器在不同空气动力学环境下的模…

ChatGPT的AI“记忆”可以记住付费客户的偏好

通过记住有关 ChatGPT Plus 订阅者的详细信息&#xff0c;OpenAI 的聊天机器人添加了更多个人助理风格的功能 OpenAI 在今年二月宣布了 “记忆 ”功能&#xff0c;该功能允许 ChatGPT 更永久地存储查询、提示和其他自定义功能。当时&#xff0c;只有 “一小部分 ”用户可以使用…

虚拟机网络桥接模式无法通信,获取到的ip为169.254.X.X

原因&#xff1a;VMware自动选择的网卡可能不对 解决&#xff1a;编辑-虚拟网络编辑器-更改桥接模式-选择宿主机物理网卡&#xff0c;断开虚拟机网络连接后重新连接即可

精简函数栈帧:优化创建和销毁过程的完全解析(建议收藏,提升内功)

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 【前文】一、函数栈帧的概念&#xff08;stack frame&#xff…

uniapp 自定义相机插件(组件版、缩放、裁剪)组件 Ba-CameraView

自定义相机插件&#xff08;组件版、缩放、裁剪&#xff09; Ba-CameraView 简介&#xff08;下载地址&#xff09; Ba-CameraView 是一款自定义相机拍照组件&#xff0c;支持任意界面&#xff0c;支持裁剪 支持任意自定义界面支持手势缩放支持裁剪&#xff08;手势拖动、比…

等级保护测评一般多长时间能做完?

一个二级或三级的系统&#xff0c;整体持续周期一到两个月 具体时间还要根据信息系统数量&#xff0c;及信息系统的规模&#xff0c;以及测评方与被测方的配合情况等&#xff0c;有所增减。 现场测评周期一般一周左右 小规模安全整改&#xff0c;包括管理制度策略配置技术&a…

【算法设计与分析】实验报告c++python实现(TSP问题、哈夫曼编码问题、顾客安排问题、最小生成树问题、图着色问题)

一、实验目的 1&#xff0e;加深学生对贪心算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 用贪心算…

基于Springboot的web后端开发三层架构上手实操

引言 我们拿到了xml文件 我们要将将xml文件中的数据加载并解析 完成数据的处理 并且返回给前端页面(result格式) 1.将xml文件放在resources目录下 xml是我们需要解析的文件 查看xml文件 2.在springboot中引入dom4j依赖 解析xml需要在springboot中引入dom4j依赖 这边我们…

iOS 创建依赖其他开源库的开源库

参考文章&#xff08;感激各位大神前路的明灯&#xff09; 参考文章一 参考项目 整体流程 流程简介 1&#xff09;使用pod命令行创建本地项目和git仓库并回答终端里的四个问题 2&#xff09;编辑podspec文件 3&#xff09;将需要开源的代码添加到Development Pods文件夹中&am…

2024第84届中国(云南昆明)教育装备展示会

关于第84届中国教育装备展示会将在云南昆明举办&#xff01; 谨此奉邀! 第84届中国教育装备展示会组委会 一、展会时间、地点 布展时间&#xff1a;2024年10月22日-24日 开展时间&#xff1a;2024年10月25日-27日 撤展时间&#xff1a;2024年10月27日 16:00-24:00 地点&a…

2024年5月前端面试记录:裸辞、旅游、面试

在职期间面试 富途 有效括号匹配 判断b是否是a的子集&#xff08;a和b有重复元素&#xff0c;要求b的同个元素出现次数<a的同个元素出现次数&#xff09; 离职原因 最有挑战的项目 技术分享做过哪些 如何发现用户痛点并解决 vue和react的相同点和不同点 单项数据流…

《有限元分析及应用》《有限元分析基础教程》-曾攀-清华大学|pdf电子书+有限元分析及应用视频教程(全85讲) 曾攀、雷丽萍 ​​​+课件PPT

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

Java -- (part20)

一.Map集合 1.概述 双列集合的顶级接口 2.实现类 HashMap 特点: a.key唯一,value可重复->如果key重复了,会发生value覆盖 b.无序 c.无索引 d.线程不安全 e.可以存null键null值 数据结构: 哈希表 方法: LinkedHashMap 特点: a.key唯一,value可重复->如果ke…

基于 Spring Boot 博客系统开发(五)

基于 Spring Boot 博客系统开发&#xff08;五&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。&#x1f33f;&#x1f33f;&#x1f33f; 基于 Spring Boot 博客系统开发&#xff08;四&#xff09;&#x1f…

vue3 ——笔记 (表单输入,监听器)

表单输入 在Vue 3中&#xff0c;v-model指令的用法稍有不同于Vue 2。在Vue 3中&#xff0c;v-model指令实际上是一个语法糖&#xff0c;它会自动将value属性和input事件绑定到组件或元素上&#xff0c;以实现双向数据绑定。 在自定义组件中使用v-model时&#xff0c;需要在组…

【docker】maven 打包docker的插件学习

docker-maven-plugin GitHub地址&#xff1a;https://github.com/spotify/docker-maven-plugin 您可以使用此插件创建一个 Docker 映像&#xff0c;其中包含从 Maven 项目构建的工件。例如&#xff0c;Java 服务的构建过程可以输出运行该服务的 Docker 映像。 该插件是 Spot…

Nginx深度解析:核心特性、应用场景与全局、events、http等全面配置指南

Nginx是一款高性能的Web服务器与反向代理服务器软件&#xff0c;以其高并发处理能力、低内存消耗和反向代理负载均衡功能闻名。它通过事件驱动、异步非阻塞I/O模型&#xff0c;实现了极高的效率和稳定性&#xff0c;广泛应用于网站部署、API代理、静态资源服务及微服务架构中&a…