1. 程式人生 > 實用技巧 >Vue基礎:插槽(slot),自定義事件內容分發($emit('事件名',引數);

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更容易理解。