<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          首頁

          解決往數組添加數據,第二次會覆蓋第一次的方案

          前端達人

          
          
          1. // 獲取緩存里邊的項目數據
          2. var e = wx.getStorageSync('projectList');
          3. if(!e){
          4. // 獲取存放項目
          5. var e = this.data.projectList;
          6. }
          7. // 獲取項目個數
          8. var a = e.length;
          9. var title = wx.getStorageSync('title');
          10. var value = wx.getStorageSync('value');
          11. var img_url = wx.getStorageSync('img_url');
          12. var i = {
          13. id: a,
          14. title: title,
          15. value: value,
          16. img_url: img_url,
          17. };
          18. e.push(i);

          這里的代碼是以小程序為案例的,所有程序都是一個道理

          直接上代碼來解釋,第二次數據會覆蓋第一次的原因就是,每次在觸發這個方法的時候初始化了數據。所以就會覆蓋數據

          所以在這個方法里邊只需要先獲取e這個數據,判斷e是否存在值,當有值的時候往里邊push

          數據,當沒有數據的時候直接將數據初始化即可




          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          文章來源:csdn

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          vue.js — 解決添加重復數據報錯問題

          前端達人

          <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript" src="js/vue.js" ></script> </head> <body> <div id="box"> <input type="button" value="添加" @click="add"> <ul> <li v-for="val in arr"> {{val}} </li> </ul> </div> </body> <script> var vm = new Vue({
                      data: {
                          arr: ['apple','pear','orange']
                      },
                      methods:{
                          add: function(){ //[Vue warn]: Duplicate value found in v-for="val in arr": "tomato".  //Use track-by="$index" if you are expecting duplicate values. //重復添加會報數據重復提示 this.arr.push('tomato');
                          }
                      }
                  }).$mount('#box'); </script> </html>
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33

          當我們點擊【添加】按鈕兩次之后,會出現如下報錯信息
          vue添加重復數據報錯

          使用track-by解決添加重復數據報錯問題

          <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript" src="js/vue.js" ></script> </head> <body> <div id="box"> <input type="button" value="添加" @click="add"> <ul> <li v-for="val in arr" track-by='$index'> {{val}} </li> </ul> </div> </body> <script> var vm = new Vue({
                      data: {
                          arr: ['apple','pear','orange']
                      },
                      methods:{
                          add: function(){ //[Vue warn]: Duplicate value found in v-for="val in arr": "tomato".  //Use track-by="$index" if you are expecting duplicate values. //重復添加會報數據重復提示 this.arr.push('tomato');
                          }
                      }
                  }).$mount('#box'); </script> </html>
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33

          解決vue添加相同數據報錯

          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          文章來源:csdn

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          JavaScript 中的作用域、預解析以及變量提升

          前端達人



          JavaScript 中的作用域、預解析以及變量提升

          作用域:變量的作用范圍

          局部作用域:函數內部



          在局部作用域聲明的變量稱為局部變量,局部變量只能在當前函數內部使用



          1)函數在執行的時候會在內存中開辟新空間



          2)當執行完畢函數之后,會關閉作用域空間(變量被銷毀)



          注意:形參也是局部變量



          function fn() {

              let b = 5

            // 局部訪問 變量 b 

              console.log(b) // 5

          }

          fn()

          // 全局訪問 變量 b

          console.log(b) // 訪問不存在的變量,報錯

          1

          2

          3

          4

          5

          6

          7

          8

          在控制臺打印得到如下結果







          全局作用域:函數外部



          1)在全局作用域聲明的變量是全局變量,全局變量可以在任何地方使用



          2)因為全局變量可以任何地方使用,所以要特別關注局部變量



          let a = 2

          function fn() {

              // 局部訪問 變量 a

              console.log(a) // 2

          }

          fn()

          // 全局訪問 變量 a

          console.log(a) // 2

          1

          2

          3

          4

          5

          6

          7

          8

          在控制臺打印得到如下結果







          函數內部之所以能夠訪問到變量 a ,是因為有一個作用鏈,函數內部訪問一個變量會先在自己的作用域內找,找不到會向上級作用域找,找不到就會報錯



          例如 如下代碼



          (找不到報錯的情況)



          function fn() {

              function fn1() {

                  function fn2() {

                      // 局部訪問 變量 a

              console.log(a) // 2

                  }

                  fn2()

              }

              fn1()

          }

          fn()

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          11

          控制臺打印







          (全局變量局部訪問的情況)



          let a = 'hello javascript'

          function fn() {

              function fn1() {

                  function fn2() {

                      // 局部訪問 變量 a

              console.log(a) // hello javascript

                  }

                  fn2()

              }

              fn1()

          }

          fn()

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          11

          12

          控制臺打印







          塊級作用域:類似局部作用域



          1)用 {} 包裹一塊



          2)let聲明變量具有塊級作用域,var聲明變量不具有塊級作用域



          例如



          (以字面量對象為例)



          let obj = {

              uname: '法外狂徒-張三',

              age: 68

          }

          1

          2

          3

          4

          想要訪問這個對象里面的屬性必須通過 obj.屬性,而不能直接訪問



          預解析

          預解析:在代碼執行之前把變量和函數會提前解析到當前作用域的最前面



          任何作用域在執行之前都要預解析 (函數優于變量)



          變量:帶有聲明的變量,只定義不賦值



          1)變量在聲明之前被訪問,變量的值為 undefined



          函數:帶有名字的函數,只定義不調用



          1)函數優于變量



          console.log(a) // undefined

          fn() // hello javascript



          function fn() {

              console.log('hello javascript')

          }

          var a = 2

          1

          2

          3

          4

          5

          6

          7

          代碼是自上而下執行,但是在代碼執行前會先進行代碼的預解析,把變量以及函數 聲明 提升到當前作用域的最前面,如上代碼,console.log(a) 會打印 undefined



          但是,注意?。。∽⒁猓。?!



          變量必須是 var 聲明的才可以,如果是 let 聲明的變量會報錯



          圖 (var 聲明的 a)







          圖 (let 聲明的 a)







          變量提升

          預解析會引起變量的提升



          變量不聲明就輸出會報錯



          console.log(a) // 報錯

          1

          控制臺打印







          用 var 聲明



          console.log(a) // undefined



          var a = 'hello javascript'

          1

          2

          3

          控制臺打印 undefined ,我們知道變量定義不賦值會輸出 undefined,說明變量已經存在并且提升了,但是只提升了聲明沒有提升賦值,所以打印 undefined ,如果沒有提升的話,就會像上面一樣在執行 console.log(a) 的時候直接報錯



          結論:var 存在變量提升



          用 let 聲明



          console.log(a) // 報錯



          let a = 'hello javascript'

          1

          2

          3

          結論:let 不存在變量提升



          補充:

          申明變量:let \ var \ const



          1)let 聲明的變量不在window內



          2)var 聲明的變量相當于給window添加了個屬性,let不會



          3)var 聲明的變量不具有塊級作用域,let具有塊級作用域



          4)var 可以重復聲明,let只能聲明一次



          5)const 用來定義常量,不可以改值



          6)const 定義的常量必須初始化有值,let可以不設置值



          建議:常量名字因為是不可以改動的值,所以常量名建議用大寫,一般用于定義固定不變的值




          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          文章來源:csdn

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


          JavaScript -- Map數據結構

          前端達人

          什么是Map

          Map和對象類似都是鍵值對的集合。

          Map和對象的區別

          對象一般用字符串當鍵。

          Map可以用數字、字符串、布爾值、null、undefined、數組、對象、Set、Map等做鍵。
          在這里插入圖片描述

          Map實例的屬性和方法

          set()

          向Map實例中添加新成員,可連續添加。
          如果新成員的鍵已存在,那么新成員將會覆蓋以存在的鍵。
          在這里插入圖片描述

          get()

          通過Map實例的鍵,來訪問其對應的值。

          獲取不存在的成員返回undefined。
          在這里插入圖片描述
          在這里插入圖片描述

          has()

          通過Map實例的鍵,來判斷成員是否存在。
          在這里插入圖片描述

          delete()

          刪除Map實例成員,刪除實例中不存在的成員不報錯。
          在這里插入圖片描述

          clear()

          清空Map實例成員。
          在這里插入圖片描述

          forEach()

          遍歷Map實例成員,接收兩個參數,第一個是一個回調,回調接收三個參數:value、key、Map。第二個參數是是this指向。
          在這里插入圖片描述

          size屬性

          獲取Map成員個數。
          在這里插入圖片描述

          Map構造函數

          二維數組

          在這里插入圖片描述

          Set

          Set必須體現出鍵和值。
          在這里插入圖片描述

          Map

          Map作為參數,傳入構造函數,相當于Map實例的克隆
          在這里插入圖片描述

          Map注意事項

          Map對于重復鍵的判斷基本遵循 ===,但在Map中NaN ===NaN。

          Map的應用

          操作DOM

           <p>1</p> <p>2</p> <script> const [p1,p2] = document.querySelectorAll('p'); const m = new Map([ [p1,'red'], [p2,'blue'] ]); m.forEach((color, elem) => { elem.style.color = color }) </script> 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12

          在這里插入圖片描述

          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          文章來源:csdn

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務


          解決vagrant上使用Homestead很慢(響應速度10s+)

          前端達人

          說明:

          使用vagrant和Homestead 在vBox上面跑laravel, 響應速度非常緩慢(大概在10+s),

          嘗試過增加虛擬機配置, 但是沒有任何效果, 經驗證也不是數據庫的原因 .

           

          通過網上查詢了解到, 是因為VirtualBox的IO引起的: http://mitchellh.com/comparing-filesystem-performance-in-virtual-machines


          解決方法1:

          在Homestead.yaml下添加type:nfs, 注意空格, map對應windows下面的物理路徑

          解決方法2:
          如果上訴方法, 還是不能增加響應速度(我的就是), 則嘗試以下方法
          安裝一個vagrant 插件


          $ vagrant plugin install vagrant-winnfsd


          然后修改 Homestead/scripts/homestead.rb 的代碼, 循環部分替換成如下:

           

          重啟vagrant 之后, 響應速度已經將至 200 ms


          ----------參考資料
          https://laracasts.com/discuss/channels/general-discussion/for-those-who-find-homesteadvagrantvirtualbox-slow-on-windows?page=1
          http://mitchellh.com/comparing-filesystem-performance-in-virtual-machines


          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          文章來源:博客園

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          Invalid default value for prop "data": Props with type Object/Array must use a factory function to r

          前端達人

          超級好用

          問題: 

           大致意思是Object/Array類型的Props必須使用工廠函數返回默認值。

           

          問題定位:

           

           

          解決辦法:

          將默認的值以函數的方式進行返回


          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          文章來源:csdn

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          Java中JSON文檔解析

          前端達人

          1.JSON是什么?

          1. JSON的全稱為JavaScript Object Notation ,也就是JavaScript對象標記法。
          2. JSON是一種輕量級的數據交換格式,用于兩個程序之間的數據交換,類似于XML文檔。

          2.JSON對象格式

          使用JSON表示一個對象的格式:

          {
              "屬性名1":"屬性值1",
              "屬性名2":"屬性值2",
              ......
              "屬性名":"屬性值n"
          }  
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6

          注意事項

          • 一個對象整體由一個大括號表示
          • 對象的屬性,是由一個個鍵值對組成
          • 鍵值對的鍵與值之間應該使用冒號隔開,而不同鍵值對之間需要使用逗號隔開
          • 鍵與值最好都使用雙引號,值可以是JavaScript中的任何一種數據類型

          示例

          {
              "name":"金蘋果",
              "info":"講述了種植蘋果的辛酸歷程"
          }  
          
          • 1
          • 2
          • 3
          • 4

          3.JSON數組表示

          JSON中的數組使用 [ ] 表示,并且數組可以跟對象互相嵌套

          格式:

          [元素1,元素2...]  
          
          • 1

          示例:

          數組包含對象

           ["張三","李四",{
                  "name":"王五",
                  "info":"一個在技術上使勁鉆研的人"
              }]  
          
          • 1
          • 2
          • 3
          • 4

          對象包含數組:

          {
              "name":"李小超",
              "friend":["張三","李四",
                        {
                          "name":"王五",
                          "info":"一個在技術上使勁鉆研的人"
                      }
                       ]
              "info":"一個非常帥氣的人"
          }  
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10

          對象與對象的嵌套:

          {
              "name":"李小超",
              "project":{
                  "school":"HPU",
                  "name":"computer"
              }
          }  
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7

          4.JSON的解析

          1. 使用Gson解析JSON文件

          1. 將Java對象轉換為JSON字符串

            String json = new Gson().toJSON(要轉換的對象);  
                    
            • 1

            代碼示例:

            Book b = new Book("金蘋果","講述了種植蘋果的辛酸路程"); String str = new Gson().toJson(b);  
                    
            • 1
            • 2
          2. 將JSON字符串轉換為Java對象

            對象 = new Gson().fromJson(JSON字符串,對象類型.class);  
                    
            • 1

            代碼示例:

            1. 將JSON字符串轉換為Java對象
             Book b2 = new Gson().fromJson(str, Book.class); System.out.println(b2.getName());  
                    
            • 1
            • 2
            1. 將JSON字符串轉換為Java集合
            String js = "{\"name\":\"金蘋果\",\"info\":\"講述了種植蘋果的辛酸歷程\",\"page\":[\"鋤禾日當午\",\"汗滴禾下土\"]}"; HashMap data = new Gson().fromJson(js,HashMap.class); System.out.println(data.get("page").getClass()); /*
                輸出結果:class java.util.ArrayList
            */  
                    
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7

            我們在寫JSON字符串的時候,需要注意使用轉義字符轉換雙引號,另外,如果鍵值對的值是JSON數組,那么對應數組在轉換之后的類型是ArrayList

          2. 使用fastJson解析JSON文件

          使用fastJSON解析與Gson十分相似,不過前者使用的是靜態方法。

          1. Java對象轉換為JSON字符串

            String json=JSON.toJSONString(要轉換的對象);  
                    
            • 1
          2. JSON字符串轉換為Java對象

            類型 對象名=JSON.parseObject(JSON字符串, 類型.class);
            或者
            List<類型> list=JSON.parseArray(JSON字符串,類型.class);  
                    
            • 1
            • 2
            • 3

            示例:
            轉換為Java對象

             Book b2 = JSON.parseObject(json1,Book.class);  
                    
            • 1

            轉換為List集合

            List list = JSON.parseArray(json1,String.class);  
                    
            • 1

            在這里進行說明一下,我們觀察JSON.parseArray()的源碼可以看到,這個方法的返回值就是一個List類型的數據,我們向方法中傳遞的第二個參數是List元素所屬的類型。


            藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

            文章來源:csdn

            分享此文一切功德,皆悉回向給文章原作者及眾讀者.
            免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

            藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務



          JavaScript|異步編程

          前端達人

          JavaScript|異步編程

          1.異步的概念

          **異步(Asynchronous, async)是與同步(Synchronous, sync)**相對的概念。在我們學習的傳統單線程編程中,程序的運行是同步的(步驟在一個控制流序列中按順序執行)。而異步的概念則是不保證同步的概念,也就是說,一個異步過程的執行將不再與原有的序列有順序關系。簡單來理解就是:同步按你的代碼順序執行,異步不按照代碼順序執行,異步的執行效率更高。異步就是從主線程發射一個子線程來完成任務。

          2.回調函數

          回調函數就是一個函數,它是在我們啟動一個異步任務的時候就告訴它:等你完成了這個任務之后要干什么。這樣一來主線程幾乎不用關心異步任務的狀態了。

          <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>異步編程</title> </head> <body> <p>等待4秒過后執行</p> <p id="p2">太陽</p> <p id="p3">月亮</p> <script> // 回調函數 function sayHello(){ document.getElementById("p2").innerHTML = "Hello!Sun"; } // 使用setTimeout()可以設置sayHello為一個4秒的過程,第一個參數是回調函數,第二個參數是毫秒數 setTimeout(sayHello,4000); </script> </body> </html> 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22

          在這里插入圖片描述

          等待四秒過后:

          在這里插入圖片描述

          主線程并未停止,body中的內容正常運行,而當4秒回調過后,子函數運行結果就改變了h2的值。




          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          文章來源:csdn

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


          vue 封裝dialog_Vue 彈出框組件的完整封裝過程

          前端達人

          引言

          因為項目搬磚需要,筆者從 2019 年 11 月份開始學習 Vue.js,在完整地敲了一遍 vue-admin 框架中的用戶管理 Demo 、斷點跟蹤前端調用流程、并摸清楚了 Vue.js 的開發套路后,總算可以出師了。

          寫作本文有兩個原因,一是對這段時間學習 Vue.js 的過程做一個總結;另外就是完成自己 2019 下半年在 GitChat 的寫作目標,8 月份曾在一個知識星球公布了下半年寫兩篇 Chat 的目標,遲遲沒有完成。

          以上就是本文產生的背景了,再說回到 Vue.js。筆者年初也弄了一陣兒 Angular.js,雖然都是前端框架,感覺 Vue.js 入門更簡單一些,其數據驅動的設計理念跟 Java 面向對象編程的思維模式相似,所以學起來更輕松。

          之所以選擇彈框組件這個話題,是因為筆者參與的新產品中,很多地方都涉及到彈出頁面,所以仔細研究了一下彈框組件的封裝原理,解決了彈出頁面封裝的技術問題后,筆者這半路前端也能夠應付一陣子開發工作了!

          環境準備

          Vue 開發相關的工具及其關系回顧,這里先回憶一下跟 Vue 項目開發有關的概念:

          名詞

          解釋

          作用

          Vue.js

          一個前端框架

          用于構建用戶界面的漸進式框架

          *.vue 文件

          一種文件類型

          以類 HTML 語法描述一個 Vue 組件

          vue-cli

          Vue 官方腳手架

          對單個 *.vue 文件進行快速原型開發

          eslint

          前端代碼檢查工具

          編寫高質量前端代碼的利器,類似 findbugs

          webpack

          模塊打包器

          類似 maven,將前端項目打包成靜態資源文件

          IDEA Vue.js 插件

          IDEA 插件

          使 IDEA 能夠支持 Vue 項目開發

          我們在使用 IDEA 開發 Vue 項目時,只需要安裝 Vue.js 插件就可以了,不需要使用 vue-cli 腳手架;引入 ESLint 是為了編寫高質量的前端代碼,也可以不用,而且 IDEA 的快速修正功能很強大,不需要完全了解 ESLint 規范;至于打包工具 webpack,初學完全可以先忽略它。

          GitHub 上有一個 Vue 的半成品項目 vueAdmin-template,可以基于它來學習或者二次開發,本文也是在它基礎上完成一個彈框組件學習案例的。這里使用 IDEA 作為開發工具,相關準備工作如下:

          IDEA 安裝 Vue.js 插件;

          IDEA 安裝 eslint 插件;

          IDEA 添加 .vue 文件模板;

          IDEA 導入 vueAdmin-template,項目地址。

          常見的幾種彈出框類型

          Web 開發過程中常用的彈框,歸納起來,主要有三類:

          消息提示框,即 alert,不需要進行操作;

          操作確認框,即 confirm,包含“確定”和“取消”按鈕;

          頁面彈出框,即 openwindow,彈出一個完整的頁面,用戶輸入信息后,通過“確定”或“取消”提交信息。

          第一、二類彈出框,ElementUI 都有封裝,拿來用即可;第三類彈出框,可以結合 el-dialog 組件完成。 在筆者參與的項目中,彈出頁面的特點在于,父組件彈出子組件后,用戶需要在彈出頁面配置信息、點擊“確定”按鈕提交。



          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          文章來源:csdn

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          echarts中關于自定義legend圖例文字

          前端達人

          文章摘自:https://blog.csdn.net/YPJMFC/article/details/78979319,非常感謝大牛分享。

          echarts中關于自定義legend圖例文字
          首先看一張echarts餅圖: 
           
          這張圖很好做,根本不值得提,但是用過echarts的可能會發現這個圖例有點不一樣,做這個圖例花了我好幾個小時去查,去試。結合一下echarts中legend圖例的特質我們分析一下一些難點:

          1.這里的圖例文本包含兩個變量,而formatter提供的變量模板只有name
          2.兩個變量的樣式各不相同
          3.對齊,換行與居中的應用



          一個個看:

          1.兩個變量
          formatter有兩種形式: 
          - 模板 
          - 回調函數

          模板

          使用字符串模板,模板變量為圖例名稱 {name}
          formatter: 'Legend {name}'

          這種想要修改name的值,暫時我做不到,歡迎讀者指正

          回調函數

          使用回調函數
          formatter: function (name) {
              return 'Legend ' + name;
          }

          我們在返回時可以對name進行修改,從而返回我們需要的值,初步改動是這樣:

          var data = [
              {value:40, name:'貨幣'},
              {value:20, name:'股票'},
              {value:40, name:'債券'}
          ]
          formatter:  function(name){
              var total = 0;
              var target;
              for (var i = 0, l = data.length; i < l; i++) {
              total += data[i].value;
              if (data[i].name == name) {
                  target = data[i].value;
                  }
              }
              return name + ' ' + ((target/total)*100).toFixed(2) + '%';
          }


          2.兩種樣式
          想自定義圖例文字樣式,就要用到富文本:rich,但是在官方文檔中看到的只有模板形式的富文本樣式配置,由1知用模板很難實現自定義name,所以只能用回調函數形式,采用富文本的形式對name進行改造:

          formatter:  function(name){
              var total = 0;
              var target;
              for (var i = 0, l = data.length; i < l; i++) {
              total += data[i].value;
              if (data[i].name == name) {
                  target = data[i].value;
                  }
              }
              var arr = [
                  '{a|'+((target/total)*100).toFixed(2)+'%}',
                  '{b|'+name+'}',
              ]
              return arr.join('\n')
          },
          textStyle:{
              rich:{
                  a:{
                      fontSize:20,
                      verticalAlign:'top',
                      align:'center',
                      padding:[0,0,28,0]
                  },
                  b:{
                      fontSize:14,
                      align:'center',
                      padding:[0,10,0,0],
                      lineHeight:25
                  }
              }
          }

          3.對齊,換行與居中
          為了圖例與第一行文字對齊,需要設置兩個樣式的padding,把文字頂到合適的位置,然后為了上下行的間隔,設置了第2行文字的行高,最終呈現了上面圖片的效果。不知道是不是有點地方做煩了,但是能最終實現自己想要的效果,很有成就感。

          4.實例
          這是完整的組件:

          class ConfigChart extends Component {

              constructor(props) {
                  super(props);
                  this.state = {};
              };
              getOption = () => {
                  var data = [
                      {value:40, name:'貨幣'},
                      {value:20, name:'股票'},
                      {value:40, name:'債券'}
                  ]
                  const option = {
                      tooltip : {
                          trigger: 'item',
                          formatter: "{a} <br/> : {c} (ehnegyq%)"
                      },
                      // formatter:  function(name){

                      //     var total = 0;
                      //     var target;
                      //     for (var i = 0, l = data.length; i < l; i++) {
                      //     total += data[i].value;
                      //     if (data[i].name == name) {
                      //     target = data[i].value;
                      //     }
                      //     }
                      //     return name + ' ' + ((target/total)*100).toFixed(2) + '%';
                      // },

                      series: [
                          {
                              name: '訪問來源',
                              type: 'pie',
                              radius: [50, 80],
                              center: ['50%', '40%'],
                              label: {
                                  normal: {
                                      show: false
                                  },
                                  emphasis: {
                                      show: false
                                  }
                              },
                              data: [
                                  {
                                      value: 40,
                                      name: '貨幣',
                                      itemStyle: { normal: { color: "#5877F0" } }
                                  },
                                  { value: 20, name: '股票', itemStyle: { normal: { color: "#AA9FFD" } } },
                                  { value: 40, name: '債券', itemStyle: { normal: { color: "#F96481" } } }
                              ]
                          }
                      ],
                      legend: {
                          x: 'center',
                          // y: 'bottom',
                          bottom:5,
                          itemGap:30,
                          itemWidth:5,
                          textStyle:{
                              fontSize: 12
                          },
                          align:'left',
                          data: [
                              {
                                  name:'貨幣',
                                  icon:'circle'
                              },
                              {
                                  name:'股票',
                                  icon:'circle'
                              },{
                                  name:'債券',
                                  icon:'circle'
                              }
                          ],
                          // formatter:'{a|{name}}\n{name}',
                          formatter:  function(name){
                              var total = 0;
                              var target;
                              for (var i = 0, l = data.length; i < l; i++) {
                              total += data[i].value;
                              if (data[i].name == name) {
                                  target = data[i].value;
                                  }
                              }
                              var arr = [
                                  '{a|'+((target/total)*100).toFixed(2)+'%}',
                                  '{b|'+name+'}',
                              ]
                              // return name + ' ' + ((target/total)*100).toFixed(2) + '%';
                              return arr.join('\n')
                          },
                          textStyle:{
                              rich:{
                                  a:{
                                      fontSize:20,
                                      verticalAlign:'top',
                                      align:'center',
                                      padding:[0,0,28,0]
                                  },
                                  b:{
                                      fontSize:14,
                                      align:'center',
                                      padding:[0,10,0,0],
                                      lineHeight:25
                                  }
                              }
                          }
                      },
                      backgroundColor: "#fff"
                  };
                  return option;
              };
              render() {
                  const _this = this;
                  const { isShow } = this.props;
                  return isShow ?
                      <div className={StyleClass.configChartWrapper}>
                          <ReactEcharts
                              option={_this.getOption()}
                              echarts={echarts}
                              style={{ height: '265px', width: $.width() }}
                              className='react_for_echarts' />
                      </div> : null;
              }

          }
          其實大神上面的數據還是有點問題,按照大神這樣做的話,餅狀圖的百分比和算出來的有一點點出入(算出來的值加起來不夠百分百),其實就是最后一項的百分比和餅狀圖的不一樣,其他的都一樣,所以,我自己修改了幾個小時,終于把它完善了(主要是綠色的代碼),代碼如下:

          this.dateEchart.setOption({

          color:['#4BC373','#4178E8','#FF5B57'],

                       tooltip: {

          trigger: 'item',

          formatter: "{a} <br/>: {c} (jljauxp%)"

          },

          legend: {

          orient: 'vertical',

          right:'10%',

          top:'40%',

          data:['微信支付','支付寶網上支付','銀行支付'],

          formatter:(name)=>{

          let target,count;

          let total=0,num=0;

          let l=this.data2.length;

          for(var i=0;i<l;i++){

          total+=this.data2[i].value;

          }

          for(i=0;i<l;i++){

          if((this.data2[i].name==name)&&(i<l-1)){

          target=this.data2[i].value;

          count=((target/total)*100).toFixed(2)+'%';

          return name+': '+count;

          }

          if((this.data2[i].name==name)&&(i==l-1)){

          for(i=0;i<l-1;i++){

          num+=parseFloat((((this.data2[i].value)/total)*100).toFixed(2));

          }

          let yy=(100-num).toFixed(2);

          return name+': '+yy+'%';

          }

          }

          }

          },

          series: [

          {

          name:'訪問來源',

          type:'pie',

          radius: ['40%', '60%'],

          center:['40%','50%'],

          avoidLabelOverlap: false,

          label: {

          normal: {

          show: false,

          position: 'center'

          },

          emphasis: {

          show: true,

          textStyle: {

          fontSize: '30',

          fontWeight: 'bold'

          }

          },

          },

          labelLine: {

          normal: {

          show: false

          }

          },

          data:this.data2

          }

          ]

                   });


          藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

          文章來源:csdn

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.
          免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合