Vue基礎:插槽(slot),自定義事件內容分發($emit('事件名',引數);
引言
上個月,C9校長拜訪華為,任正非:光刻機這事你們別管,並直指問題的關鍵,任正非說,大學的任務是把基礎科學做好,不能哪裡熱搞哪裡,光刻機,化學制劑,工藝製程深層次是物理、化學問題,更直白的說是基礎科學問題(如材料分子學等)。如果基礎學科學不好,而是哪裡熱搞哪裡,那麼你就永遠勞於應付。
相信大家也都記得去年日韓矛盾時,日本政府針對韓國的半導體材料出口管制,其中就包含了光刻膠、氟化氫和氟聚醯亞胺三個品種。而日本之所以有這麼大的實力敢制裁韓國的巨無霸三星和海力士,最根本的,日本是基礎學科做的最好的國家。據說日本在氫氟酸的提純度已經達到99.9999999999%甚至更高,其他公司無法替代。
Part1
計算機程式設計基礎
記得我再學習計算機課程時,當時老師說,計算機基本上只有三個語法:順序,判斷和迴圈,至於跳轉已經破壞流程的嚴謹性,最好少用。這種觀點類似中國的“一生二,二生三,三生萬物”一樣。只要掌握這三種基礎,那麼你遇到問題,都能輕易解決。好吧,具個例子:
如果今天下雨或者下雪,那麼我就帶雨傘
如果轉換為計算機語言,寫成if語句
if ((today=="下雨" )|| if (today=="下雪")) { console.write("帶雨傘"); } else { //Do Noting }
計算機Web的基礎
計算機Web的基礎是什麼?是Http請求和響應。不論你學習的是ASP, ASP.NET, JSP,PHP等,不管你用的那種語言,都必須瞭解,Web的請求是Request和Response。學習web的第一步就是了解
HTML基礎。因為所有的開發語言都是以HTML為基礎的,如果你不瞭解基礎,就會發現遇到問題無從下手。
如下,有一個 a.xxx 頁面(注意:這裡的xxx因為與語言無關,所以,他可以是a.asp,可以是a.aspx,也可以是a.jsp或者a.php等),其基礎是
<form method="post" action="b.xxx" > <input type="text" name="txt" /> </form>
在上面程式碼裡,你必須瞭解form表單有2個極其重要的數學:method,採用什麼提交方式:是get還是post,action:用來表示誰來接受這些引數。
裡面name="txt"定義了控制元件的名字,這意味著,在後臺可以通過 Request["txt"]獲取到這些引數。
有了這個基礎,你會發現早期的 ASP.NETWeb語法糖就很容易解決。下面的這段程式碼,已經簡單到不能再簡單的地方了:頁面裡放置了一個TextBox,點選button獲取文字框的值。
<!DOCTYPE html> <script runat="server"> protected void Button1_Click(object sender, EventArgs e) { string content = txt.Text; } </script> <html> <head runat="server"> </head> <body> <form id="form1" runat="server" > <asp:TextBox runat="server" ID="txt"></asp:TextBox> <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> </form> </body> </html>
但是,假如有一天,<asp:TextBox runat="server" ID="txt"></asp:TextBox>一下子變為<input type="text" name="txt" />,相信很多初學者開始緊張了:沒有了 runat="server",
我怎麼獲取使用者的輸入?
這個時候,就是考驗基礎的時刻到了,就像開頭說的,“不管形勢如何千萬萬化,但是萬變不離其中”,不管ASP.NET你怎麼封裝,你最終都是Http的請求和相應,都要遵循HTML表單的原理。
因此,只要使用string content= Request.Form["txt"];就可以輕而易舉的獲得使用者的輸入。
<!DOCTYPE html> <script runat="server"> protected void Button1_Click(object sender, EventArgs e) { string content= Request.Form["txt"]; } </script> <html> <head runat="server"> </head> <body> <form id="form1" runat="server" > <input type="text" name="txt" /> <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> </form> </body> </html>
面向物件程式設計和函式程式設計
面向物件程式設計,通常是面向過程的,而面向函式變成是面向函式的。例如,要求一個數組中最大的數,如果用java開發是自己實現程式碼,然後在程式裡呼叫。
public static int Max(int[]array) { int max=array[0]; for (int i=1;i<array.length;i++) { if(max<array[i]) { max=array[i]; } } return max; }
相反,函式程式設計通常直接呼叫函式,最直接的就是SQL:
select max(age) from table
在SQL裡,直接呼叫 max()函式即可,至於怎麼實現,你不用關心。
Part2
.NET的擴充套件語法出現海量變化應該來自:模擬SQL和JavaScript,
.NET的利器:匿名函式和擴充套件方法(下述)
擴充套件方法允許對類進行自定義方法,而匿名函式最大的作用是完成了函式的閉包寫法。
.NET語法糖Linq-----模擬SQL
.NET第一次產生大量語法糖的靈感應該來自於SQL,在資料庫裡,SQL在處理資料方面有著極簡的的語法,例如獲取年齡大於18歲並且小於25的人只要一句語法就夠了
select * from table where age>18 and age<25
有鑑於SQL的簡潔實用,.NETLinq應運而生。Linq中存在大量的擴充套件方法。在System.Linq名稱空間中,存在兩個使用極其廣泛的類Enumerable和Queryable。他們都是返回的資料集。
下面程式碼是Linq一個簡單的例子:
static void Main(string[] args) { List<Student> students = getInitStudents(); IEnumerable<Student> temp1 = students.Where(stu => stu.Age > 18 && stu.Age < 25); foreach (var t in temp1) { Console.WriteLine(t.Name + t.Age); } } public static List<Student> getInitStudents() { List<Student> stuList = new List<Student>(); stuList.Add(new Student { No = 1000, Name = "王歡", Sex = "女", Age = 20, Score = 50 }); stuList.Add(new Student { No = 1001, Name = "張燕", Sex = "女", Age = 21, Score = 89 }); stuList.Add(new Student { No = 1001, Name = "於強", Sex = "男", Age = 26, Score = 34 }); // 初始化資料 return stuList; } } class Student { public int No { get; set; } public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public float Score { get; set; } } }View Code
在程式碼裡IEnumerable<Student> temp1 = students.Where(stu => stu.Age > 18 && stu.Age < 25); 可以認為 .NET通過擴充套件來模擬SQL語法。
如果仔細看Where語法原始碼,他的定義為
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
從函式簽名可以看出:擴充套件方法Where從IEnumerable<TSource>型別的source中篩選出滿足條件predicate的結果,返回值仍為IEnumerable<TSource>型別。
就像SQL語句一樣,Linq可以選擇你想要的單獨的列,不是返回全部列。
var temp2 = stuList.Where(it => it.Age >= 20) .Select(x => new {name=x.Name,age=x.Age })
foreach (var t in temp2) { Console.WriteLine(t); }
.NET語法糖----模仿Javascript的箭頭函式
.NET語法越來越像Javascript,畢竟JS的強大大家有目共睹。js核心幾個重點是:箭頭函式,方法擴充套件,匿名方法。
在JS經典裡,如果對每個元素求他的平方,需要寫成:
// JS 程式碼 var data = [2, 4, 5, 6, 7]; data.forEach(function (item) { return item * item; } );
而使用箭頭函式,可以寫為
// JS 程式碼
data.forEach(x=>x*x);
看似一小步卻是寫法的一大步,因為他讓程式可讀性極大提高。在這方面.NET借鑑了JS的語法,在.NET裡,參考上面的Linq,利用箭頭函式,讓C#的語法極其簡化。
//C#程式碼
var temp2 = stuList.Where(it => it.Age >= 20) .Select(x => new {name=x.Name,age=x.Age }) .OrderBy(y=>y.name)
.NET擴充套件方法應該也是借鑑JS的原型。如JS裡陣列沒有求最大值的方法,但是通過原型很容易擴充套件
//給陣列增加一個 Max函式
Array.prototype.Max = function () {
return Math.max.apply(null, this.map((seg) => {return +seg}))
}
var data = [2, 4, 5, 6, 7];
//現在任何一個數組都可以呼叫 Max方法
var result= data.Max();
在.NET裡,擴充套件方法裡,通過this實現,例如WordCount(this String str) ,然後就可以把WordCount想string的傳統方法一樣使用。
class Program { static void Main(string[] args) { string s = "Hello Extension Methods"; int i = s.WordCount(); } } public static class MyExtensions { public static int WordCount(this String str) { return str.Split(' ').Length; } }
以上介紹了.NET語言的趨勢,因為只有瞭解了上面的語法,那麼在你閱讀.NETFramework原始碼
https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,e73922753675387a或者.NET CORE原始碼https://github.com/dotnet/aspnetcore/blob/master/src/Http/Http/src/Builder/ApplicationBuilder.cs更容易理解。