沐鳴註冊_css設置邊框可以用哪個屬性?

css設置邊框可以用border簡寫屬性,它可以在一個聲明設置所有的邊框屬性,按照border-width、border-style、border-color順序設置;也可以單獨使用這幾個屬性來設置邊框樣式。

邊框屬性介紹:

border屬性:

一個簡寫屬性,在一個聲明中所有的邊框屬性。

可以設置的屬性分別(按順序):border-width, border-style,和border-color.

如果上述值缺少一個沒有關係,例如border:#FF0000;是允許的。

border-width屬性:

border-width 簡寫屬性為元素的所有邊框設置寬度,或者單獨地為各邊邊框設置寬度。

只有當邊框樣式不是 none 時才起作用。如果邊框樣式是 none,邊框寬度實際上會重置為 0。不允許指定負長度值。

border-style屬性:

border-style 屬性用於設置元素所有邊框的樣式,或者單獨地為各邊設置邊框樣式。

只有當這個值不是 none 時邊框才可能出現。

border-color屬性:

border-color 屬性設置四條邊框的顏色。此屬性可設置 1 到 4 種顏色。

border-color 屬性是一個簡寫屬性,可設置一個元素的所有邊框中可見部分的顏色,或者為 4 個邊分別設置不同的顏色。

示例:

1、在一個border簡寫屬性設置邊框。

<html>
<head>
<style type="text/css">
p 
{
border: medium double rgb(250,0,255)
}
</style>
</head>

<body>
<p>Some text</p>
</body>

</html>

2、按照border-width、border-style、border-color屬性順序依次設置邊框樣式。

示例:

<html>
<head>
<style type="text/css">
p 
{
border-width:medium;
border-style:double;
border-color:rgb(250,0,255);
}
</style>
</head>

<body>
<p>Some text</p>
</body>

</html>

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9440

沐鳴註冊平台_編程和音樂真的很像嗎?

在過去的幾十年時間里,對音樂作品和編程同時感興趣的計算機科學家成功地將兩者結合在一起。現在的人工智能譜寫的音樂,幾乎與由專業音樂人創建的沒有區別。

很多專業的開發人員對音樂有着真正的激情,以及許多音樂家涉足過編程,這些已經不是什麼秘密。例如,Elvis Costello,一位多產的英國音樂家,被譽為“他那一代最優秀的詞曲作家”,在他的音樂生涯騰飛之前,在上世紀70年代操作IBM 360。

你可以發現為什麼人們會沉溺於這兩個領域:因為創作旋律和編寫算法之間有很多共同之處。從表面上看這兩者似乎頗不相同,但是開發有創造性的一面,而譜曲亦有机械化的一面。那麼,編程和譜曲有什麼相似之處呢?

你的心中已經有音樂的脈動

讓我們先來看一看譜曲和編程之間的相似之處。

1.它們都遵循關於以下邏輯規則

譜曲,和編程一樣,需要古希臘人所謂的三藝。即:

  1. 語法:紮實理解基本原理——樂譜和編程語言規則的理論或知識。
  2. 邏輯:你需要能夠創建“邏輯推理”。當音樂創作或編碼時,你需要遵循邏輯規則使得“活動件”一起正常工作。
  3. 修辭:和語法和邏輯一樣,你需要說服聽眾和新方法的使用者接受標準做法。

如果不遵循作曲和開發的基本原理,一切都無法正常運轉。一個胡亂編寫的程序將充滿bug,在相同意義上,病態的和弦結構會造成樂曲的不和諧。

2.它們從一件件小事開始構建了美的東西

要成為一個偉大的鋼琴家,你必須先練習和完善基礎知識:簡單、重複的音階和琶音。要成為一個偉大的開發者,你需要花費大量時間來確保即使是最簡單的表達式,也能夠優雅和被正確編碼。從一件件小事開始,你漸漸打造出了一個個偉大的東西,因此:

3.你需要能夠見微知著

正如作曲家必須考慮到樂團的不同樂器組以及這些樂器組是如何組合在一起的,而開發者則需要在他們的頭腦中保持一個抽象的“大局觀”,當他們開始構建程序架構的時候。這兩個學科都需要構建一些更大,更好的東西。

4.自我表達是關鍵

音樂和軟件開發都需要創造力和自我表達能力:兩者都需要培養自己的風格,創造一些新的和令人振奮的東西。

5.你需要涉獵技術

音樂家和開發人員需要花費很長的時間來思考他們的創作如何與其他產品交互,以及如何呈現在“最終用戶”的手中。作曲家可能會增加重音符號以指示樂團成員要演奏的風格。吉他手可能會考慮使用外部硬件(amps,效果器等),或他們希望在錄音室里製作他們的歌曲。同樣的,開發人員需要牢記別人將在哪種設備和什麼上下文中如何使用他們的最終產品。

6.兩者都包括協作和個人主義

莫扎特單獨花了很多時間來想他的下一個曲譜,儘管如此,他依然需要與他人合作——也就是他指揮的樂師。同樣,最成功的開發人員絕對不是一個純內向的人:他們需要與最終用戶、經理和用戶體驗設計師等人員合作。

我不是音樂開發人員!

雖然兩者有很多的共同點,但一些反對意見也值得我們聽一聽。不是每一個開發人員都能成為下一個貝多芬!

1.這個比喻是不是只是一種我們作為開發人員吹牛和顯擺的方式?

正如Coding Horror博客的作者認為的那樣,開發人員將自己的技藝與繪畫,音樂或其他藝術形式之間作比較不僅僅是一種比喻,更多的是一種自我誇耀。當然,我們都希望我們正在構建的app能夠像Gershwin的音樂一樣棒一樣好,或者我們剛剛設計好的網站能夠像Miles Davis的《Kind of Blue》一樣影響深遠。但說實話,這的確大不相同,不是嗎?

2.編程是為了解決問題

當你被要求去設計一個app的時候,通常是為了解決問題,例如,特定的業務或消費者問題。開發人員善於解決此類問題,但這是否真的可以比作音樂?從最純粹的角度看,譜曲是純真感情和情緒的迸發和表達。

3.編程有一個非常不同於音樂的目的

當你開發任意一種工具時,最終目標是讓終端用戶能夠做一些具體的事情。假設你正在構建一個業務app——你的創作應該意味着為最終用戶的日常工作提供便利。相比之下,音樂,則並沒有一個特定的“目的”,只是一種超越純粹的享受。

它們有多重要

我們依然無法做出決定:雖然顯然,譜曲和開發絕對有着一些共同的因素,但它們也有很多區域是存在分歧的。我們所知道的是,開發人員和音樂家都可以豐富我們的生活,並給我們一些以前不知道我們需要,但是現在生活不能沒有的東西。

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9438

沐鳴登陸地址_不要過度使用React.useCallback()

我博客的一位讀者在Facebook上聯繫到我,提出了一個有趣的問題。他說,他的隊友不管在什麼情況下,都會把每一個回調函數封裝在 useCallback() 裏面。

import react, { useCallback } from 'react';

function MyComponent() {
  const handleClick = useCallback(() => {
    // handle the click event
  }, []);

  return <MyChild onClick={handleClick} />;
}

“每個回調函數都應該被記住,以防止使用回調函數的子組件被無用地重新渲染”,這是他的隊友的理由。

這句話與事實相去甚遠。此外,useCallback() 的這種用法會使組件變慢,從而損害性能。

在本文中,我將解釋如何正確使用 useCallback()。

1.了解函數相等性檢查

在深入研究 useCallback() 用法之前,讓我們區分一下鈎子要解決的問題:函數相等性檢查。

讓我們定義一個名為 factory() 的函數,該函數返回函數:

function factory() {
  return (a, b) => a + b;
}

const sum1 = factory();
const sum2 = factory();

sum1(1, 2); // => 3
sum2(1, 2); // => 3

sum1 === sum2; // => false
sum1 === sum1; // => true

sum1 和 sum2 是將兩個数字相加的函數,它們是由 factory() 函數創建的。

函數 sum1 和 sum2 共享相同的代碼源,但是它們是不同的對象,比較它們 sum1 === sum2 結果為 false。

這就是JavaScript的工作方式,對象(包括函數對象)僅等於其自身。

2.useCallback() 的目的

共享相同代碼的不同函數實例往往在react組件內部創建。

當 react 組件主體創建一個函數(例如回調或事件處理程序)時,這個函數會在每次渲染時重新創建。

import react from 'react';

function MyComponent() {
  // handleClick在每次渲染時重新創建
  const handleClick = () => {
    console.log('Clicked!');
  };

  // ...
}

handleClick 在 MyComponent 的每次渲染中都是一個不同的函數對象。

因為內聯函數很“便宜”,所以在每次渲染時重新創建函數不是問題,每個組件有幾個內聯函數是可以接受的。

然而,在某些情況下,你需要保留一個函數的一個實例:

  • 包裝在 react.memo()(或 shouldComponentUpdate )中的組件接受回調prop。
  • 當函數用作其他hooks的依賴項時 useEffect(…,[callback])

這就是當 useCallback(callbackFun, deps) 幫助你的情況:給出相同的依賴值 deps,hook在兩次渲染之間返回相同的函數實例。

import react, { useCallback } from 'react';

function MyComponent() {
  // handleClick是同一個函數對象
  const handleClick = useCallback(() => {
    console.log('Clicked!');
  }, []);

  // ...
}

handleClick 變量將在不同的 MyComponent 的渲染之間始終擁有相同的回調函數對象。

3.一個好用例

想象一下,你有一個呈現大的項目列表組件:

import react from 'react';

function MyBigList({ items, handleClick }) {
  const map = (item, index) => (
    <div onClick={() => handleClick(index)}>{item}</div>;
  );
  return <div>{items.map(map)}</div>;
}

export const MyBigList = React.memo(MyBigList);

MyBigList 渲染了一個項目列表,要知道這個列表可能很大,可能有幾百個項目。要保留重新渲染的列表,可以將其封裝到 React.memo 中。

單擊一個項目時,MyBigList 的父組件需要提供項目列表和處理程序功能。

import React from 'react';

import useSearch from './fetch-items';

function MyParent({ term }) {
  const handleClick = useCallback((item) => {
    console.log('You clicked ', item);
  }, [term]);

  const items = useSearch(term);

  return (
    <MyBigList
      items={items}
      handleClick={handleClick}
    />
  );
}

handleClick 回調由 useCallback() 記憶。只要 term 變量保持不變,useCallback() 就會返回相同的函數對象。

即使由於某些原因重新啟用了 MyParent 組件,handleClick 仍保持不變,並且不會破壞 MyBigList的記憶。

4.一個“壞”的用例

讓我們回顧一下本文簡介中的示例:

import React, { useCallback } from 'react';

function MyComponent() {
  const handleClick = useCallback(() => {
    // handle the click event
  }, []);

  return <MyChild onClick={handleClick} />;
}

function MyChild ({ onClick }) {
  return <button onClick={onClick}>I am a child</button>;
}

記住 handleClick 是否有意義?

沒有,因為調用 useCallback() 需要很多工作,每次渲染 MyComponent 時,都會調用 useCallback() Hook。

從內部來講,React確保返回相同的對象函數。即便如此,內聯函數仍然在每次渲染時創建,useCallback() 只是跳過了它。

即使用 useCallback() 返回相同的函數實例,也不會帶來任何好處,因為優化要比沒有優化花費更多。

不要忘記增加的代碼複雜性,你必須確保 useCallback() 的 deps 與您在 memoized 回調中使用的 deps 保持同步。

只需接受每次重新渲染時創建新的函數:

import React, { useCallback } from 'react';

function MyComponent() {
  const handleClick = () => {
    // handle the click event
  };

  return <MyChild onClick={handleClick} />;
}

function MyChild ({ onClick }) {
  return <button onClick={onClick}>I am a child</button>;
}

5.總結

任何優化都會增加複雜性,任何過早添加的優化都會帶來風險,因為優化后的代碼可能會多次更改。

原文:https://dmitripavlutin.com/dont-overuse-react-usecallback/

作者:Dmitri Pavlutin

翻譯:微信公眾號《前端外文精選》

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/8995

沐鳴註冊網站_IT 已成為最瘋狂的加班行業,沒有之一

原文作者:人民日報經濟社會 – 林麗鸝

據說,某互聯網公司招了個日本人做研發,上班第一天就對部門同事說:“我在日本工作時是個加班狂,每天都很晚回家,希望大家跟上我的步伐。”一個月之後他辭職回日本了,扔下一句話:“你們這樣加班,經常睡在公司是很不人道的。”

程序猿問科比:“科比,你為何如此成功?”科比反問:“你知道洛杉磯每天凌晨4點的樣子嗎?”程序猿:“知道,那個時候我一般還沒下班。你問這個幹嘛?”科比:“不幹嘛,草!”談話結束了!

IT已成為最瘋狂的加班行業,沒有之一

夜幕降臨,當IT大樓里依然燈火通明時,那一刻,我彷彿王進喜、石傳翔等勞模靈魂附體,我知道我不是一個在加班,我不是一個人!連續9個通宵加班都不是事,一點不誇張,這是本人的親身經歷。

過度加班,為啥我們就停不下來了呢?

無效加班:連夜忙真能出活嗎?“ 有時候主管布置任務,事先缺少溝通,大家加班好幾天,成果出來了,最後用不上,工作忙卻沒有效率,做了無用功。”——深圳程序員韓軒

韓軒是一名在深圳打拚的程序員,“夜夜做項目,敲碼到凌晨;左右不是人,都是‘程序猿’。”程序員自稱“程序猿”,有幾分自嘲和無奈。

每個月要加多少班? 韓軒沒仔細算過:“ 加班補貼每小時15 元,周六翻倍,我每月的加班費通常有3000 元左右,這樣算下來每天加班至少在4 個小時以上。”

一次,韓軒所在部門為某銀行開發新程序,對方要得緊,工作重任務急。當時,他每周都要干滿6天,每天從早上9點至少工作到晚上10點,有時還要通宵加班。

我國《勞動法》規定,勞動者每日工作時間不超過8小時、平均每周工作時間不超過44小時。因特殊原因需要延長工作時間的,每日不得超過3 小時,每月不得超過36 小時。

韓軒說,他並不知道自己加班已經超過了《勞動法》規定的上限。“ 現在工作難找,有一個穩定的飯碗不容易。再說,雖然總是加班,但公司會按時發加班費,這比很多單位強。”

為了省時間,韓軒中午和晚上都在公司吃外賣,吃完繼續堆代碼,每周僅有的一天休息日基本都在補覺。“有一種肥,叫做‘ 加班肥’,在這家公司工作一年,我就胖了十幾斤,上樓都喘,身體素質大不如前。”

某餐飲外賣公司對全國多個大城市24小時訂單的統計显示,深圳在晚上7 點至次日5 點的訂餐比例高居榜首,訂餐者大多是深夜忙碌的加班員工。

工作忙、時間緊,常常是加班的原因。但在韓軒看來,有的加班效率不高:

“ 平時,公司領導常叮囑大家注意健康,但在布置工作時就顧不上這些,安排的工作量經常超標,不加班根本完不成。不少任務事先缺少溝通,大家加班好幾天,成果出來了,最後用不上,工作忙卻沒有效率,做了無用功。”

韓軒說:“即使按時完成工作,客戶通常也會不斷讓你修改、優化。因此,有些人第一次交上去的時候就給自己留下了‘優化’的空間,然後加班磨洋工。很少有員工願意跟公司就加班問題討價還價,只要還打算在那兒工作,就得忍着。除非用腳投票,跳槽換東家。”

前不久,受不了長期加班之苦,韓軒跳槽到另一家公司,“雖然還是編程序,但這家公司很開明。公司領導表示,如果員工總加班,一定是工作安排有問題,比如,需要一個星期完成的任務只給了三四天。為此,公司注意改進管理方式,合理分配工作。”由於上下級之間溝通順暢,大家幹勁十足,工作效率也提高了。

“現在,我上班時間差不多就能把工作完成。下班后,還能看看書、會會朋友,周末也有時間陪家人。工作不再乏味枯燥,生活也有意思多了。”韓軒說。

無謂加班:“只爭朝夕”就要犧牲休息日嗎?

“周末開會,表面看充滿了一種只爭朝夕、夙夜在公的‘工作幹勁’,其實應該反過來想想:到底有多少真正要緊的事非得在周末興師動眾?”——北京某雜誌社編輯陸晶

陸晶在北京一家雜誌社工作,談起加班,她有很多話要說:“我的生活都被加班擠佔了,不是在開會,就是在出差;不是在採訪,就是在趕稿。”

陸晶坦承,最初加班是自己拖沓造成的:“我剛開始做記者時,寫稿精力不集中,不時聊聊天、看看手機,上班時沒效率,只好晚上加班接着干。”

“但很多時候,連續加班是單位對工作安排不合理造成的,這其實是對職工休息權的漠視。”陸晶說,“我還曾經參加過一個採訪團,連續出差兩周,周末也在工作。組織者壓根兒就沒有考慮過周末需要休息,反而認為周末採訪是‘敬業’。”

陸晶認為,很多在休息時間安排的加班完全可以避免,“有一個周末,我正陪父母逛街,突然接到同事電話,說有急事要集體到單位加班。我連忙趕到辦公室,原來,是主編認為一篇稿子的結構有問題,要集體討論修改。其實,稿子的出版日期排在了下個月,完全可以等第二天上班再說。”

陸晶注意到很多公司、機關習慣於在周末開會。每次開會都是單位領導帶頭,上上下下一片忙碌,“周末開會,表面看充滿了一種只爭朝夕、夙夜在公的‘工作幹勁’,其實應該反過來想想:到底有多少真正要緊的事非得在周末興師動眾?”

陸晶認為,不少無謂加班還與外在競爭壓力太大有關:到了下班時間,領導還沒走,你敢走嗎?同事還在工作,你好意思先下班嗎?如果比其他人下班早,會不會顯得工作態度不积極?“ 如果都這麼熬時間,能力強的人往往被能力低的人‘ 熬’走了。”陸晶說。

一些流行的價值觀也助長了加班之風。“ 父母從小就告訴我‘ 先吃苦后享福’,似乎一定要奮鬥出成績才有權休息。”陸晶說,“ 在此觀念下,許多人恨不得時時刻刻都在勤奮努力,而又不自覺地‘勤中偷懶’,結果造成工作時低效、休息時忐忑,實際上是生活、工作‘兩傷’。”工作時間科學規劃、統籌安排,是減少無謂加班的利器。“ 就我所在的團隊來說,過去總是在周五開選題會,組長還催促大家周末落實。周末聯繫不到採訪對象,大家各自為政,手忙腳亂卻沒什麼成果,更得不到休息。今年開始,選題會改為周一開,大家在辦公室當面溝通、定好方案就馬上執行,加班少了,雜誌的質量也不降反升。”陸晶說。

無償加班:加班費容易領到嗎?

“加班多是計劃之外的,很難事先申請。還有人習慣回家加班,很難精確記錄加班時間。申報程序太複雜,實際上是給員工領加班費設置障礙。”——上海某上市公司財務經理張光宇

人在職場,要求“零加班”也不現實。既然總會有人加班,就應該明確加班補償,不能無條件加班。

《勞動法》規定,安排勞動者延長工作時間的,支付不低於工資150%的工資報酬。休息日安排勞動者工作又不能安排補休的,支付不低於工資200%的工資報酬。法定休假日安排勞動者工作的,支付不低於工資300%的工資報酬。然而,這樣的規定在現實中顯得很尷尬,人們吐槽說:“年薪制的意思就是不給加班費”“腦力勞動都是包月不計流量”“加班費不是想領就能領”……

張光宇以前在上海一家外資諮詢公司工作,“ 我們拿年薪確實沒有加班費,有時候趕上一個日程緊張的項目,五加二、白加黑很尋常。”

今年初,張光宇跳槽到一家上市公司擔任財務經理。這家公司規定,員工加班有加班費,但能領到的人寥寥無幾。原來,按公司規定,員工加班要提前打報告申請,獲批后的加班才算加班,沒申請的加班不算加班,並且員工還要詳細記錄加班的時間,上報核實后才能領加班費。

“ 加班大多是計劃之外的,工作沒做完自然而然地多做一會兒,很難事先申請。”張光宇說,“ 還有人習慣回家加班,很難精確記錄加班時間。我的團隊成員都反映申報程序太複雜,從來沒報過加班費。”

張光宇認為,設計繁瑣的加班費申報程序,實際上是給員工領取加班費設置障礙:“ 很多人為了保住飯碗,加班費難領也只好無償加班。”

除了加班費,勞動者加班后還可以調休。“ 我在外資諮詢公司時,如果一個項目擠占太多周末,項目負責人會幫組員申請增加幾天帶薪假期。但新公司沒有這樣的調休制度。”張光宇表示,“ 希望用人單位能充分尊重勞動者申請調休的權利。”

專家認為,確保勞動者的休息權,不僅有賴於相關法律的進一步健全,還需要企業細化管理;不僅需要管理者增強尊重勞動者的觀念,也需要勞動者自己珍視與用好休息權。對此,管理部門和各級工會應切實發揮作用。

國外如何對待加班?

上班時間高效工作

主動加班可以倒休

延時加班給予補償

1、美國:老闆付不起加班費

美國人在工作時間上很較真,到點就走人,1分鐘都不差。當然,如果有急活需要加班,他們也會配合,但加班費比正常薪水高出一倍以上,公司還得給加班職工叫個披薩餅之類的外賣。長時間加班,美國僱員是不會幹的,老闆也付不起加班費。沃爾瑪公司就曾被“加班費”絆倒過三次:2005年,因侵佔員工休息時間,沃爾瑪被加州一家法院判決賠償1.72億美元;2006年,賓夕法尼亞州一陪審團裁定,沃爾瑪因存在強迫員工在休息時間工作的行為,需支付7800萬美元的罰款;2007年,該公司又為5萬名加州員工支付了超過390萬美元的加班補償,同時支付19.89萬美元的民事罰款。這“肉”割得讓人心疼吧?

2、德國:用高效工作避免加班

除了醫生、護士等專業性、時間性極強的職業外,德國普通職員大多在傍晚五六點鐘按時下班回家,和家人共進晚餐或與朋友聚會。如果確實無法按時完成工作該怎麼辦呢?德國人一般會採取兩種對策:第一,更加高效地工作。很多德國人清晨就開始抓緊工作,有時甚至不吃午飯。總之,他們會想方設法在下午5點之前完成手中的任務。第二,堅持責任不在自己身上。也就是說,如果不能按時結束工作,就設法證明是因為公司沒有雇傭與工作量相符的勞動力,才導致工作做不完,應該由公司負責。基於以上兩點,德國人總能準時下班。

3、英國:長時間加班可倒休

大部分英國公司都制訂了“加班須申請”的制度。比如,倫敦某金融公司規定:員工單日加班超過2小時,必須提前2天申請;申請時需寫明加班時間、加班期間工作內容,並獲得至少兩位上司批准。長時間加班基本上都可以靈活地換成今後的倒休。英國法定帶薪假期是每年28天,有些公司明確規定,若員工在年底未完成標準的休假天數,就扣除其相應天數的工資。僱主們主動提醒員工休假,也是希望員工能以更加飽滿的身心狀態回到工作崗位。

4、日本:開始鼓勵員工向加班說“不”

加班,是日本職場人的常態。日本加班現象之嚴重是出了名的,連“過勞死”一詞也產生於日本。這些年,日本政府察覺到加班帶來的一系列問題,鼓勵企業採取措施讓員工準時下班。貿易公司伊藤忠商事表示,願意以更早的下班時間來吸引應屆畢業生;打印機製造商理光明確禁止在晚上8點以後工作;優衣庫服裝連鎖店的運營商迅銷還醞釀推出4小時工作制,滿足那些想要更好平衡工作與生活的員工需求。

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9088

沐鳴娛樂_AngularJS中幾種Providers的區別

什麼是Provider?

Angularjs文檔對provider的定義:provider是一個帶有$get()方法的對象。injector調用$get方法創建一個新的service的實例。provider還有一些其他的方法,可以用來配置provider。

Angularjs使用$provide註冊新的providers。providers基本上都會創建一個新實例, 但每個provider只創建一次。$provide提供了6種方法創建自定義provider, 我會用簡單的代碼示例分別解釋他們。

6種方法如下:

constant

value

service

factory

decorator

provider

constant

constant能被injected到任何地方。constant不能被decorator攔截, 意味着constant的值永遠不能被改變。

var app = angular.module('app', []); 
app.config(function ($provide) {
  $provide.constant('movieTitle', 'The Matrix');
}); 

app.controller('ctrl', function (movieTitle) {
  expect(movieTitle).toEqual('The Matrix');
});

Angularjs提供了一種更簡便的方式創建constant. 你可以將上面3至5行的代碼重寫為:

app.constant('movieTitle', 'The Matrix');


Value

value是一個簡單的可被注入的值,可以是string, number, 也可以是function。

與constant不同的是:value不能被注入到configurations, 但value能被decorators攔截。

var app = angular.module('app', []); 
app.config(function ($provide) {
 $provide.value('movieTitle', 'The Matrix')
});

app.controller('ctrl', function (movieTitle) {
 expect(movieTitle).toEqual('The Matrix');
})

創建value的簡單方法:

app.value('movieTitle', 'The Matrix');


Service

service是一個可以注入的構造函數。如果你想,你可以在函數中指定需要的依賴。

service是一個單例, 只被創建一次。services是一個很好的方式,用於控制器之間傳遞數據,如共享數據。

var app = angular.module('app' ,\[\]); 
app.config(function ($provide) {
 $provide.service('movie', function () {
   this.title = 'The Matrix';
 });
});

app.controller('ctrl', function (movie) {
 expect(movie.title).toEqual('The Matrix');
});

創建service簡單方式:

app.service('movie', function () {
 this.title = 'The Matrix';
});


Factory

factory是一個可注入的函數。

與service的相同點:factory也是一個單例,也可以在此函數中指定依賴。

區別是:factory注入一個普通函數,Angularjs將調用此函數,而service注入一個構造函數。

service是一個構造函數,要調用new創建一個新對象。而用factory,你可以讓這個函數返回你想要的任何東西。

你將會看到,factory是一個只有$get方法的provider。

var app = angular.module('app', []); 
app.config(function ($provide) {
 $provide.factory('movie', function () {
   return {
     title: 'The Matrix';
   }
 });
}); 

app.controller('ctrl', function (movie) {
 expect(movie.title).toEqual('The Matrix');
});

創建factory的簡單方式:

app.factory('movie', function () {
 return {
   title: 'The Matrix';
 }
});


Decorator

decorator可以修改或封裝其它的providers,但constant不能被裝飾。

var app = angular.module('app', []); 
app.value('movieTitle', 'The Matrix'); 
app.config(function ($provide) {
 $provide.decorator('movieTitle', function ($delegate) {
   return $delegate + ' - starring Keanu Reeves';
 });
});

app.controller('myController', function (movieTitle) {
 expect(movieTitle).toEqual('The Matrix - starring Keanu Reeves');
});


Provider

provider是所有providers中最複雜的,可以有複雜的creation函數和配置選項。

provider實際是一個可配置的factory。 provider接受一個對象或構造函數。

var app = angular.module('app', []); 
app.provider('movie', function () {
 var version;
 return {
   setVersion: function (value) {
     version = value;
   },
   $get: function () {
     return {
       title: 'The Matrix' + ' ' + version
     }
   }
 }
});

app.config(function (movieProvider) {
 movieProvider.setVersion('Reloaded');
});

app.controller('ctrl', function (movie) {
 expect(movie.title).toEqual('The Matrix Reloaded');
});


總結

所有的providers只會被實例化一次,因此他們都是單例的。

除了constant,其他的providers都可以被decorated。

constant是一個值, 可以被注入到任何地方,它的值不能被改變。

value是一個簡單的可注入的值。

service是一個可注入的構造函數。

factory是以個可注入的函數。

decorator可以修改或封裝其它的providers,除了constant。

provider是一個可配置的factory。

原文:https://xebia.com/blog/differences-between-providers-in-angularjs/

  

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9033

沐鳴註冊網站_CSS浮動標準修復top塌陷和清除浮動及IE兼容標準格式

1、浮動的特性

1、浮動元素有左浮動(float:left)和右浮動(float:right)兩種
2、浮動的元素會向左或向右浮動,碰到父元素邊界、其他元素才停下來
3、相鄰浮動的塊元素可以並在一行,超出父級寬度就換行
4、浮動讓行內元素或塊元素自動轉化為行內塊元素(此時不會有行內塊元素間隙問題)
5、浮動元素後面沒有浮動的元素會佔據浮動元素的位置,沒有浮動的元素內的文字會避開浮動的元素,形成文字饒圖的效果
6、父元素如果沒有設置尺寸(一般是高度不設置),父元素內整體浮動的元素無法撐開父元素,父元素需要清除浮動
7、浮動元素之間沒有垂直margin的合併

2、浮動的缺點及坑

1、top塌陷
2、li子元素浮動屬性無法對ul的
3、IE對:after或者:befroe兼容

3、clearfix修復代碼標準格式


  
   
    /*top塌陷*/ .clearfix:after,.clearfix:before{ content: ""; display: table; } /*清除浮動*/ .clearfix:after{ clear: both; } /*IE兼容*/ .clearfix{ zoom: 1; }
   
  

__EOF__

本文作者:
胸毛君
本文鏈接:https://www.cnblogs.com/lzq70112/p/13130246.html

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9317

沐鳴測速註冊_你真的了解ES6的Set,WeakSet,Map和WeakMap嗎?

之前在學習 ES6 的時候,看到 Set 和 Map,不知道其應用場景有哪些,只覺得很多時候會用在數組去重和數據存儲,後來慢慢才領悟到 Set 是一種叫做集合的數據結構,Map 是一種叫做字典的數據結構。

本文在gitthub做了收錄:https://github.com/Michael-lzg/my–article/blob/master/javascript/

Set

Set 本身是一個構造函數,用來生成 Set 數據結構。Set 函數可以接受一個數組(或者具有 iterable 接口的其他數據結構)作為參數,用來初始化。Set 對象允許你存儲任何類型的值,無論是原始值或者是對象引用。它類似於數組,但是成員的值都是唯一的,沒有重複的值。

const s = new Set()
[2, 3, 5, 4, 5, 2, 2].forEach((x) => s.add(x))
for (let i of s) {
  console.log(i)
}
// 2 3 5 4

Set 中的特殊值

Set 對象存儲的值總是唯一的,所以需要判斷兩個值是否恆等。有幾個特殊值需要特殊對待:

  • +0 與 -0 在存儲判斷唯一性的時候是恆等的,所以不重複
  • undefined 與 undefined 是恆等的,所以不重複
  • NaN 與 NaN 是不恆等的,但是在 Set 中認為 NaN 與 NaN 相等,所有隻能存在一個,不重複。

Set 的屬性:

  • size:返回集合所包含元素的數量
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5])
items.size // 5

Set 實例對象的方法

  • add(value):添加某個值,返回 Set 結構本身(可以鏈式調用)。
  • delete(value):刪除某個值,刪除成功返回 true,否則返回 false。
  • has(value):返回一個布爾值,表示該值是否為 Set 的成員。
  • clear():清除所有成員,沒有返回值。
s.add(1).add(2).add(2)
// 注意2被加入了兩次

s.size // 2

s.has(1) // true
s.has(2) // true
s.has(3) // false

s.delete(2)
s.has(2) // false

遍歷方法

  • keys():返回鍵名的遍歷器。
  • values():返回鍵值的遍歷器。
  • entries():返回鍵值對的遍歷器。
  • forEach():使用回調函數遍歷每個成員。

由於 Set 結構沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個值),所以 keys 方法和 values 方法的行為完全一致。

let set = new Set(['red', 'green', 'blue'])

for (let item of set.keys()) {
  console.log(item)
}
// red
// green
// blue

for (let item of set.values()) {
  console.log(item)
}
// red
// green
// blue

for (let item of set.entries()) {
  console.log(item)
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]

Array 和 Set 對比

  • Array 的 indexOf 方法比 Set 的 has 方法效率低下
  • Set 不含有重複值(可以利用這個特性實現對一個數組的去重)
  • Set 通過 delete 方法刪除某個值,而 Array 只能通過 splice。兩者的使用方便程度前者更優
  • Array 的很多新方法 map、filter、some、every 等是 Set 沒有的(但是通過兩者可以互相轉換來使用)

Set 的應用

1、Array.from 方法可以將 Set 結構轉為數組。

const items = new Set([1, 2, 3, 4, 5])
const array = Array.from(items)

2、數組去重

// 去除數組的重複成員
;[...new Set(array)]

Array.from(new Set(array))

3、數組的 map 和 filter 方法也可以間接用於 Set

let set = new Set([1, 2, 3])
set = new Set([...set].map((x) => x * 2))
// 返回Set結構:{2, 4, 6}

let set = new Set([1, 2, 3, 4, 5])
set = new Set([...set].filter((x) => x % 2 == 0))
// 返回Set結構:{2, 4}

4、實現並集 (Union)、交集 (Intersect) 和差集

let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])

// 並集
let union = new Set([...a, ...b])
// Set {1, 2, 3, 4}

// 交集
let intersect = new Set([...a].filter((x) => b.has(x)))
// set {2, 3}

// 差集
let difference = new Set([...a].filter((x) => !b.has(x)))
// Set {1}

weakSet

WeakSet 結構與 Set 類似,也是不重複的值的集合。

  • 成員都是數組和類似數組的對象,若調用 add() 方法時傳入了非數組和類似數組的對象的參數,就會拋出錯誤。
const b = [1, 2, [1, 2]]
new WeakSet(b) // Uncaught TypeError: Invalid value used in weak set
  • 成員都是弱引用,可以被垃圾回收機制回收,可以用來保存 DOM 節點,不容易造成內存泄漏。
  • WeakSet 不可迭代,因此不能被用在 for-of 等循環中。
  • WeakSet 沒有 size 屬性。

Map

Map 中存儲的是 key-value 形式的鍵值對, 其中的 key 和 value 可以是任何類型的, 即對象也可以作為 key。 Map 的出現,就是讓各種類型的值都可以當作鍵。Map 提供的是 “值-值”的對應。

Map 和 Object 的區別

  1. Object 對象有原型, 也就是說他有默認的 key 值在對象上面, 除非我們使用 Object.create(null)創建一個沒有原型的對象;
  2. 在 Object 對象中, 只能把 String 和 Symbol 作為 key 值, 但是在 Map 中,key 值可以是任何基本類型(String, Number, Boolean, undefined, NaN….),或者對象(Map, Set, Object, Function , Symbol , null….);
  3. 通過 Map 中的 size 屬性, 可以很方便地獲取到 Map 長度, 要獲取 Object 的長度, 你只能手動計算

Map 的屬性

  • size: 返回集合所包含元素的數量
const map = new Map()
map.set('foo', ture)
map.set('bar', false)
map.size // 2

Map 對象的方法

  • set(key, val): 向 Map 中添加新元素
  • get(key): 通過鍵值查找特定的數值並返回
  • has(key): 判斷 Map 對象中是否有 Key 所對應的值,有返回 true,否則返回 false
  • delete(key): 通過鍵值從 Map 中移除對應的數據
  • clear(): 將這個 Map 中的所有元素刪除
const m = new Map()
const o = { p: 'Hello World' }

m.set(o, 'content')
m.get(o) // "content"

m.has(o) // true
m.delete(o) // true
m.has(o) // false

遍歷方法

  • keys():返回鍵名的遍歷器
  • values():返回鍵值的遍歷器
  • entries():返回鍵值對的遍歷器
  • forEach():使用回調函數遍歷每個成員
const map = new Map([
  ['a', 1],
  ['b', 2],
])

for (let key of map.keys()) {
  console.log(key)
}
// "a"
// "b"

for (let value of map.values()) {
  console.log(value)
}
// 1
// 2

for (let item of map.entries()) {
  console.log(item)
}
// ["a", 1]
// ["b", 2]

// 或者
for (let [key, value] of map.entries()) {
  console.log(key, value)
}
// "a" 1
// "b" 2

// for...of...遍歷map等同於使用map.entries()

for (let [key, value] of map) {
  console.log(key, value)
}
// "a" 1
// "b" 2

數據類型轉化

Map 轉為數組

let map = new Map()
let arr = [...map]

數組轉為 Map

Map: map = new Map(arr)

Map 轉為對象

let obj = {}
for (let [k, v] of map) {
  obj[k] = v
}

對象轉為 Map

for( let k of Object.keys(obj)){
  map.set(k,obj[k])
}

Map的應用

在一些 Admin 項目中我們通常都對個人信息進行展示,比如將如下信息展示到頁面上。傳統方法如下。

<div class="info-item">
  <span>姓名</span>
  <span>{{info.name}}</span>
</div>
<div class="info-item">
  <span>年齡</span>
  <span>{{info.age}}</span>
</div>
<div class="info-item">
  <span>性別</span>
  <span>{{info.sex}}</span>
</div>
<div class="info-item">
  <span>手機號</span>
  <span>{{info.phone}}</span>
</div>
<div class="info-item">
  <span>家庭住址</span>
  <span>{{info.address}}</span>
</div>
<div class="info-item">
  <span>家庭住址</span>
  <span>{{info.duty}}</span>
</div>

js 代碼

mounted() {
  this.info = {
    name: 'jack',
    sex: '男',
    age: '28',
    phone: '13888888888',
    address: '廣東省廣州市',
    duty: '總經理'
  }
}

我們通過 Map 來改造,將我們需要显示的 label 和 value 存到我們的 Map 后渲染到頁面,這樣減少了大量的html代碼

<template>
  <div id="app">
    <div class="info-item" v-for="[label, value] in infoMap" :key="value">
      <span>{{label}}</span>
      <span>{{value}}</span>
    </div>
  </div>
</template>

js 代碼

data: () => ({
  info: {},
  infoMap: {}
}),
mounted () {
  this.info = {
    name: 'jack',
    sex: '男',
    age: '28',
    phone: '13888888888',
    address: '廣東省廣州市',
    duty: '總經理'
  }
  const mapKeys = ['姓名', '性別', '年齡', '電話', '家庭地址', '身份']
  const result = new Map()
  let i = 0
  for (const key in this.info) {
    result.set(mapKeys[i], this.info[key])
    i++
  }
  this.infoMap = result
}

WeakMap

WeakMap 結構與 Map 結構類似,也是用於生成鍵值對的集合。

  • 只接受對象作為鍵名(null 除外),不接受其他類型的值作為鍵名
  • 鍵名是弱引用,鍵值可以是任意的,鍵名所指向的對象可以被垃圾回收,此時鍵名是無效的
  • 不能遍歷,方法有 get、set、has、delete

總結

Set

  • 是一種叫做集合的數據結構(ES6新增的)
  • 成員唯一、無序且不重複
  • [value, value],鍵值與鍵名是一致的(或者說只有鍵值,沒有鍵名)
  • 允許儲存任何類型的唯一值,無論是原始值或者是對象引用
  • 可以遍歷,方法有:add、delete、has、clear

WeakSet

  • 成員都是對象
  • 成員都是弱引用,可以被垃圾回收機制回收,可以用來保存 DOM 節點,不容易造成內存泄漏
  • 不能遍歷,方法有 add、delete、has

Map

  • 是一種類似於字典的數據結構,本質上是鍵值對的集合
  • 可以遍歷,可以跟各種數據格式轉換
  • 操作方法有:set、get、has、delete、clear

WeakMap

  • 只接受對象作為鍵名(null 除外),不接受其他類型的值作為鍵名
  • 鍵名是弱引用,鍵值可以是任意的,鍵名所指向的對象可以被垃圾回收,此時鍵名是無效的
  • 不能遍歷,方法有 get、set、has、delete

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9313

沐鳴登錄_客戶端與服務端長連接的幾種方式

一、ajax 輪詢

實現原理:ajax 輪詢指客戶端每間隔一段時間向服務端發起請求,保持數據的同步。

優點:可實現基礎(指間隔時間較短)的數據更新。

缺點:這種方法也只是盡量的模擬即時傳輸,但並非真正意義上的即時通訊,很有可能出現客戶端請求時,服務端數據並未更新。或者服務端數據已更新,但客戶端未發起請求。導致多次請求資源浪費,效率低下。

二、long poll 長輪詢

實現原理:

long poll 指的是客戶端發送請求之後,如果沒有數據返回,服務端會將請求掛起放入隊列(不斷開連接)處理其他請求,直到有數據返回給客戶端。然後客戶端再次發起請求,以此輪詢。在 HTTP1.0 中客戶端可以設置請求頭 Connection:keep-alive,服務端收到該請求頭之後知道這是一個長連接,在響應報文頭中也添加 Connection:keep-alive。客戶端收到之後表示長連接建立完成,可以繼續發送其他的請求。在 HTTP1.1 中默認使用了 Connection:keep-alive 長連接。

優點:減少客戶端的請求,降低無效的網絡傳輸,保證每次請求都有數據返回,不會一直佔用線程。

缺點:無法處理高併發,當客戶端請求量大,請求頻繁時對服務器的處理能力要求較高。服務器一直保持連接會消耗資源,需要同時維護多個線程,服務器所能承載的 TCP 連接數是有上限的,這種輪詢很容易把連接數頂滿。每次通訊都需要客戶端發起,服務端不能主動推送。

三、iframe 長連接

實現原理:
在網頁上嵌入一個 iframe 標籤,該標籤的 src 屬性指向一個長連接請求。這樣服務端就可以源源不斷地給客戶端傳輸信息。保障信息實時更新。

優點:消息及時傳輸。

缺點:消耗服務器資源。

四、WebSocket

實現原理:

Websocket 實現了客戶端與服務端的雙向通信,只需要連接一次,就可以相互傳輸數據,很適合實時通訊、數據實時更新等場景。

Websocket 協議與 HTTP 協議沒有關係,它是一個建立在 TCP 協議上的全新協議,為了兼容 HTTP 握手規範,在握手階段依然使用 HTTP 協議,握手完成之後,數據通過 TCP 通道進行傳輸。

Websoket 數據傳輸是通過 frame 形式,一個消息可以分成幾個片段傳輸。這樣大數據可以分成一些小片段進行傳輸,不用考慮由於數據量大導致標誌位不夠的情況。也可以邊生成數據邊傳遞消息,提高傳輸效率。

與 HTTP 的區別:
以下是一個 WebSoket 協議的請求響應報文頭,與 HTTP 協議的區別是:

URL是以 ws: 開頭,如果是對應的 HTTPS,則以 wss: 開頭。WebSocket 使用 ws 或 wss 為統一資源標誌符,其中 wss 表示在 TLS 之上的 Websocket。

Status Code:101。該狀態碼錶示協議切換。服務器返回了 101 ,表示沒有釋放 TCP 連接。WebSoket 協議握手階段還是依賴於 HTTP 協議,到數據傳輸階段便切換協議。

Conection:upgrade,表示協議升級。在 HTTP 協議中,該請求頭有兩個值,一個是 close , HTTP/1.0 默認值,表示客戶端或服務端想要關閉連接。另一個是 keep-alive,HTTP/1.1 默認值,表示長連接。

以下頭部字段是只有 WebSocket 協議才有的字段。
請求頭:
Sec-WebSocket-Extension:表示客戶端協商的拓展特性。
Sec-WebSocket-Key:是一個 Base64 encode 的密文,由瀏覽器隨機生成,用來驗證是否是 WebSocket 協議。
Sec-WebSocket-Version:表示 WebSocket 協議版本。

響應頭:
Sec-WebSocket-Extension:表示服務端支持的拓展特性。
Sec-WebSocket-Accept:與客戶端的 Sec-WebSocket-Key 相對應,是經過服務器確認,加密過後的 Sec-WebSocket-Key。

優點:

雙向通信。客戶端和服務端雙方都可以主動發起通訊。
沒有同源限制。客戶端可以與任意服務端通信,不存在跨域問題。
數據量輕。第一次連接時需要攜帶請求頭,後面數據通信都不需要帶請求頭,減少了請求頭的負荷。
傳輸效率高。因為只需要一次連接,所以數據傳輸效率高。
缺點:

長連接需要後端處理業務的代碼更穩定,推送消息相對複雜;
長連接受網絡限制比較大,需要處理好重連。
兼容性,WebSocket 只支持 IE10 及其以上版本。
服務器長期維護長連接需要一定的成本,各個瀏覽器支持程度不一;
成熟的 HTTP 生態下有大量的組件可以復用,WebSocket 則沒有,遇到異常問題難以快速定位快速解決。

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9074

沐鳴開戶_學會享受孤獨是通往成功的第一步

我們生活在一個社交異常活躍的世界,在這個世界里,人們漸漸地忽視獨處的重要性。辦公室的設計都正在拋棄以往的那種小隔板間,而採用那種開放的辦公區域;學校的學生也不再坐在自己獨立擁有的桌椅前,而是成組地呆在一起。持續不斷的消息提示音是我們現代文明裡的噪音,不斷地提醒我們每一條短信、每一條微博和每一條各種通知。即使是平淡無奇的燒菜做飯,人們也樂於在朋友圈裡發圖分享。

所有這些社交活動有一個直接的後果就是,我們基本不再擁有獨處的時間。是的,人們都在說,融入社交圈是好事,與其他人交往可以豐富我們的生活,但是任何好的事情都應該有個度,不是嗎?

人類所有的不幸都來源於害怕和厭惡孤獨。

–拉布呂耶爾(Jean de la Bruyere)

一項涉及92個公司總共600名程序員的調查表明,每個公司內部的效率水平大致是穩定的,但是不同的公司效率卻有高有低。效率較高的公司在這一點上是一致的:他們都不使用時尚的開放辦公區,而使用能免於被打擾的私人辦公區。效率最高的公司中,有62%聲稱自己在工作時擁有足夠的個人空間,而反過來,效率比較低的公司中只有19%的人持相同觀點。並且,在最低效的那些公司中,有76%的人說自己經常被人打擾,以致工作中斷。

能夠享受孤獨並不僅僅可以帶來工作質量的提升,對於維護精神和心情的良好狀態也是有用的。為了讓生活更加充實,你必須學會享受獨處的時光。孤獨可以帶來太多太多的好處,這裏舉一些最明顯的:

1、有助恢復精力

我們任何人都需要時間去恢復精力,即使是那些無可救藥的性格外向的人也是一樣。除了靜靜一個人獃著,沒有其他辦法有這種效果。當你自己獨處的時候,通過慢慢品嘗精神上的安靜和孤獨可以幫你從一天的壓力中獲得解脫。

2、可以做任何你想做的事情

和其他人呆在一起是很有趣,但是同時,我們也更傾向於隱藏真實的自我。你總是需要不斷地調整自己的想法,以此來適應其他人的喜好。但是當你自己獨處的時候,你可以做你自己真正想做的事情。你可以毫不猶豫穿上自己愛穿的衣服,吃想吃的東西,把時間花在自己認為值得的事情上。

3、學會相信自己

自由並不僅僅是做自己想做的事情,更是相信自己的直覺、了解自己直覺的能力,並且不考慮任何外界的影響或者壓力。獨處可以幫助你對自己建立一個更真實的了解,教會你相信自己:了解自己是誰,自己知道些什麼,什麼樣的事情是適合自己的。當和其他人在一起的時候,你總是不斷地去觀察其他人的反應,並且以此來調整自己的感想和行為,更好地融入大家。有時,甚至你自己也對此沒有察覺。當你自己獨處的時候,這一切都由你來做主。你可以培養自己的思想和喜好,並且不用擔心被別人左右。一旦你習慣於享受孤獨,那麼你就會發現自己真正有能力做到什麼,不再在意別人對你的限定。

4、提高自己的情商

情商是指發現並且理解自己和他人的心情的能力,並且憑藉這種了解來指導自己的行動、與他人建立適當的聯繫。TalentSmart公司曾經對100萬人做過一次調查,發現90%最優秀的人的情商都非常高。學會了解自我是具備高情商的必備基礎,如果做不到了解自我,那麼情商不可能提高。因為了解自我需要理解自己的情緒以及如何來應對不同的人和處境,這就需要你能夠多多反思,而在自己獨處的時候可以更好地反思。

5、可以提升自信

學會享受獨處可以極大地提升自信。當你獨處的時候如果發生煩躁不安的情緒,那麼這時你會很容易地去考慮自己為什麼在煩躁,或者是因為有別人在場所以才強言歡笑。學會享受獨處可以足夠地了解自己,因此提升自信。

6、可以更會欣賞別人

獨處讓人的心變得更柔軟。讓你更容易用全新的眼光去看待他人,幫助你培養感恩的情懷,對他人他事也有了更好的認識。

7、提升效率

俗話說人多力量大,這話如果對於掃樹恭弘=叶 恭弘的活兒可能是真的,但是對於創造性的工作來說,可完全不是這麼回事。即使對於頭腦風暴這樣的會議,所帶來的效果也經常是願望大於現實。德克薩斯州工農大學(Texas A&M)的研究人員發現,頭腦風暴會因為“認知固化”的原因而阻礙提高生產率。認知固化指的是人們一起工作的時候經常被別人的想法所牽絆,以致於沒法想出真正創新的點子。並且越多的人一起參与,這種固化的壞處越明顯。讓自己靜靜一個人工作不僅可以減少不必要的紛擾,也不會因為“廚子太多”而陷入麻煩。

總結一下:

獨處對每個人都大有裨益,趁着周末讓自己一個人獃獃吧。

附記:通過獨處自己有了什麼樣的收穫呢?請把您的心得通過評論區分享給我吧,因為我通過你也能學到我所不了解的。

作者:Travis Bradberry博士與人合著了暢銷書《情商2.0》,創辦的TalentSmart公司,是世界領先的提供情商培訓和測試的服務機構,客戶涵蓋世界500強中的75%。他的書被翻譯成25種語言在超過150個國家發售。博士為《新聞周刊》、《泰晤士報》、《時代周刊》、《商業周刊》、《財富》、《福布斯》等媒體撰寫文章或者被選為封面人物。

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9593

沐鳴平台註冊登錄_JSON和HTML之間互轉實現

主要實現功能html轉json,再由json恢復html

可去除 style 和 script 標籤

將行內樣式轉換為 js object

將 class 轉換為數組形式

主要依賴於 htmlparser2 ; 這是一個性能優越、功能強大的 html 解析庫

直接上代碼

import { Parser } from "htmlparser2"

const numberValueRegexp = /^\d+$/
const zeroValueRegexp = /^0[^0\s].*$/
const scriptRegexp = /^script$/i
const styleRegexp = /^style$/i
const selfCloseTagRegexp = /^(meta|base|br|img|input|col|frame|link|area|param|embed|keygen|source)$/i

const TAG = 'tag'
const TEXT = 'text'
const COMMENT = 'comment'

/**
 * 去除前後空格
 */
export const trim = val => {
    return (val || '').replace(/^\s+/, '').replace(/\s+$/, '')
}
/**
 * 首字母大寫
 */
export const capitalize = word => {
    return (word || '').replace(/( |^)[a-z]/, c => c.toUpperCase())
}
/**
 * 駝峰命名法/小駝峰命名法, 首字母小寫
 */
export const camelCase = key => {
    return (key || '').split(/[_-]/).map((item, i) => i === 0 ? item : capitalize(item)).join('')
}
/**
 * 大駝峰命名法,首字母大寫
 */
export const pascalCase = key => {
    return (key || '').split(/[_-]/).map(capitalize).join('')
}
export const isPlainObject = obj => {
    return Object.prototype.toString.call(obj) === '[object Object]'
}
/**
 * 行內樣式轉Object
 */
export const style2Object = (style) => {
    if (!style || typeof style !== 'string') {
        return {}
    }
    const styleObject = {}
    const styles = style.split(/;/)
    styles.forEach(item => {
        const [prop, value] = item.split(/:/)
        if (prop && value && trim(value)) {
            const val = trim(value)
            styleObject[camelCase(trim(prop))] = zeroValueRegexp.test(val) ? 0 : numberValueRegexp.test(val) ? Number(val) : val
        }
    })
    return styleObject
}

export const tojsON = (html, options) => {
    options = Object.assign({ skipStyle: false, skipScript: false, pureClass: false, pureComment: false }, options)
    const json = []
    let levelNodes = []
    const parser = new Parser({
        onopentag: (name, { style, class: classNames, ...attrs } = {}) => {
            let node = {}
            if ((scriptRegexp.test(name) && options.skipScript === true) ||
                (styleRegexp.test(name) && options.skipStyle === true)) {
                node = false
            } else {
                if (options.pureClass === true) {
                    classNames = ''
                }
                node = {
                    type: TAG,
                    tagName: name,
                    style: style2Object(style),
                    inlineStyle: style || '',
                    attrs: { ...attrs },
                    classNames: classNames || '',
                    classList: options.pureClass ? [] : (classNames || '').split(/\s+/).map(trim).filter(Boolean),
                    children: []

                }
            }
            if (levelNodes[0]) {
                if (node !== false) {
                    const parent = levelNodes[0]
                    parent.children.push(node)
                }
                levelNodes.unshift(node)
            } else {
                if (node !== false) {
                    json.push(node)
                }
                levelNodes.push(node)
            }
        },
        ontext(text) {
            const parent = levelNodes[0]
            if (parent === false) {
                return
            }
            const node = {
                type: TEXT,
                content: text
            }
            if (!parent) {
                json.push(node)
            } else {
                if (!parent.children) {
                    parent.children = []
                }
                parent.children.push(node)
            }
        },
        oncomment(comments) {
            if (options.pureComment) {
                return
            }
            const parent = levelNodes[0]
            if (parent === false) {
                return
            }
            const node = {
                type: COMMENT,
                content: comments
            }
            if (!parent) {
                json.push(node)
            } else {
                if (!parent.children) {
                    parent.children = []
                }
                parent.children.push(node)
            }
        },
        onclosetag() {
            levelNodes.shift()
        },
        onend() {
            levelNodes = null
        }
    })
    parser.done(html)
    return json
}
const setAttrs = (attrs, results) => {
    Object.keys(attrs || {}).forEach(k => {
        if (!attrs[k]) {
            results.push(k)
        } else {
            results.push(' ', k, '=', '"', attrs[k], '"')
        }
    })
}
const toElement = (elementInfo, results) => {

    switch (elementInfo.type) {
        case TAG:
            const tagName = elementInfo.tagName
            results.push('<', tagName)
            if (elementInfo.inlineStyle) {
                results.push(', elementInfo.inlineStyle, '"')
            }
            if (elementInfo.classNames) {
                results.push(', elementInfo.classNames, '"')
            }
            setAttrs(elementInfo.attrs, results)
            if (selfCloseTagRegexp.test(tagName)) {
                results.push(' />')
            } else {
                results.push('>')
                if (Array.isArray(elementInfo.children)) {
                    elementInfo.children.forEach(item => toElement(item, results))
                }
                results.push('</', tagName, '>')
            }
            break;
        case TEXT:
            results.push(elementInfo.content)
            break;
        case COMMENT:
            results.push("<!-- ", elementInfo.content, " -->")
            break;
        default:
        // ignore
    }
}
export const tohtml = json => {
    json = json || []
    if (isPlainObject(json)) {
        json = [json]
    }
    const results = []
    json.forEach(item => toElement(item, results))
    return results.join('')
}


示例

const source = '<div>測試1</div> <div>測試2</div>'
const htmljson = toJSON(source, { skipScript: true, skipStyle: true, pureClass: true, pureComment: true })
const jsonhtml = toHTML(htmljson)
console.log(htmljson)
console.log(jsonhtml)


參數說明

skipScript 過濾 script 標籤,默認 false

skipStyle 過濾 style 標籤,默認 false

pureClass 去掉 class 屬性,默認 false

pureComment 去掉註釋,默認 false

備註

htmlparser2 通過 npm i htmlparser2 –save 進行安裝即可  

原文鏈接 IT浪子の博客 > JSON和HTML之間互轉實現

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9055