SharePoint Framework 把你的客戶端web部件連線到SharePoint
把你的web部件連線到SharePoint來訪問SharePoint中的功能和資料,為終端使用者提供更完整的體驗。本篇會基於之前構建的hello world的web部件繼續改進。
執行gulp serve
不多數,這步還是首要的,否則沒法進行除錯的。確保你已經在命令列中執行了gulp serve這個命令。
訪問頁面上下文
當本地工作臺被承載起來的時候,你是無法獲得SharePoint頁面上下文的,當然你仍然能用許多不同的方式測試你的web部件。比如,你可以專注於構建web部件的UX(使用者體驗),使用假資料去模擬與SharePoint的互動。
但是當工作臺在SharePoint中承載時,你就可以訪問頁面上下文了,上下文提供了很多關鍵的屬性,如:
>網站標題
>網站絕對URL
>網站相對URL
>使用者登入名
你可以在web部件類中使用下面的變數訪問頁面上下文:
this.context.pageContext
切換到Visual Studio code(或者是你喜歡的IDE),開啟檔案src\webparts\helloWorld\HelloWorldWebPart.ts。在render方法中,用下面的程式碼替換程式碼塊中的innerHTML部分:
this.domElement.innerHTML = `
<div class='${styles.helloWorld}'>
<div class='${styles.container}'>
<div class='ms-Grid-row ms-bgColor-themeDark ms-fontColor-white ${styles.row}'>
<div class='ms-Grid-col ms-u-lg10 ms-u-xl8 ms-u-xlPush2 ms-u-lgPush1'>
<span class='ms-font-xl ms-fontColor-white'>Welcome to SharePoint!</span>
<p class='ms-font-l ms-fontColor-white'>Customize SharePoint experiences using Web Parts.</p>
<p class='ms-font-l ms-fontColor-white'>${this.properties.description}</p>
<p class='ms-font-l ms-fontColor-white'>Loading from ${this.context.pageContext.web.title}</p>
<a href='https://github.com/SharePoint/sp-dev-docs/wiki' class='ms-Button ${styles.button}'>
<span class='ms-Button-label'>Learn more</span>
</a>
</div>
</div>
</div>
</div>`;
注意一下${ }是如何被用來在HTML塊中輸出變數的。一個額外的HTML的P標籤用來顯示this.context.pageContext.web.title屬性。由於這個web部件現在是從本地環境載入的,標題會顯示為Local Workbench。
儲存檔案,執行著的gulp serve會發現儲存操作並:
>自動編譯和打包更新的程式碼。
>重新整理你的本地工作臺頁面(因為web部件程式碼需要重新載入)。
你可以將Visual Studio Code和命令列窗體左右排列放在一起,就能發現上述的機制。
在你的瀏覽器中,訪問本地的workbench.html,連結為:http://localhost:4321/temp/workbench.html,如下圖。
下面我們們訪問SharePoint的workbench.aspx,完整的URL是這樣的格式,具體的domain自行修改:https://your-sharepoint-site-url/Shared%20Documents/workbench.aspx。
我們仍然用Chrome去看一下效果,如下圖,可以看到能夠讀取到網站的標題了。
定義列表模型
你需要一個列表模型去開始跟SharePoint列表資料互動,你需要兩個模型來獲取列表。
切換到Visual Studio Code,開啟檔案src\webparts\helloWorld\HelloWorldWebPart.ts。
在HelloWorldWebPart類的上方定義如下的介面模型:
export interface ISPLists {
value: ISPList[];
}
export interface ISPList {
Title: string;
Id: string;
}
新增完程式碼的檔案如下圖所示,ISPList介面用來掌管我們要連線的SharePoint列表資訊。
從模擬儲存獲取列表
你需要一個假的儲存去返回假的資料來測試本地的工作臺。
在src\webparts\helloWorld路徑建立一個名為MockHttpClient.ts的新檔案,在專案結構上的helloWorld節點右鍵,選擇New File。
然後在新建的檔案中輸入以下程式碼:
import { ISPList } from './HelloWorldWebPart';
export default class MockHttpClient {
private static _items: ISPList[] = [{ Title: 'Mock List', Id: '1' }];
public static get(restUrl: string, options?: any): Promise<ISPList[]> {
return new Promise<ISPList[]>((resolve) => {
resolve(MockHttpClient._items);
});
}
}
關於上面的程式碼需要知道以下幾點:
>由於在HelloWorldWebPart.ts檔案中有很多匯出,特定的一個匯入使用大括號{}指定了。在這裡,只需要匯入資料模型ISPList。
>當從預設模組匯入時(這裡是HelloWorldWebPart),你不需要輸入檔案的副檔名。
>它將MockHttpClient類匯出為預設模組,這可以在其他檔案被匯入。
>它編譯初始的ISPList模擬陣列並返回。
儲存檔案,現在你可以在HelloWorldWebPart類中使用MockHttpClient類了。首先你需要匯入MockHttpClient模組。
開啟HelloWorldWebPart.ts檔案。
在程式碼import { IHelloWorldWebPartProps } from './IHelloWorldWebPartProps';的下面貼上下面的程式碼:
import MockHttpClient from './MockHttpClient';
在HelloWorldWebPart類中新增下面的私有方法來模擬獲取列表的操作。
private _getMockListData(): Promise<ISPLists> {
return MockHttpClient.get(this.context.pageContext.web.absoluteUrl)
.then((data: ISPList[]) => {
var listData: ISPLists = { value: data };
return listData;
}) as Promise<ISPLists>;
}
儲存檔案,新增完程式碼之後的檔案如下圖:
從SharePoint網站獲取列表
接下來你需要從當前SharePoint網站獲取列表。你將會使用SharePoint REST API來從網站獲取列表資料,該操作的地址為https://yourtenantprefix.sharepoint.com/_api/web/lists。
在HelloWorldWebPart類中新增下面的方法來從SharePoint中獲取列表資料:
private _getListData(): Promise<ISPLists> {
return this.context.httpClient.get(this.context.pageContext.web.absoluteUrl + `/_api/web/lists?$filter=Hidden eq false`)
.then((response: Response) => {
return response.json();
});
}
該方法使用了一個httpClient幫助類,這個類在SharePoint客戶端平臺上可用來執行REST API。上面的程式碼中它使用ISPLists模型並應用了不獲取隱藏列表的篩選條件。
儲存檔案,切換到執行gulp serve的命令列視窗看看是否有錯誤發生。如果有錯誤發生的話需要先修復錯誤再往後繼續。
新增新的樣式
SharePoint Framework使用Sass作為CSS前處理器,特別使用了SCSS語法,該語法完全符合正常的CSS語法。Sass擴充套件了CSS語言,允許你使用像變數、巢狀規則和內聯匯入等功能來為你的web部件組織和建立高效的樣式表。SharePoint Framework裡面已經提供了SCSS編輯器,它可以將你的Sass檔案轉換成正常的CSS檔案,同時還在開發過程中提供了型別的版本。
要想新增新的樣式,開啟檔案HelloWorld.module.scss,在這個SCSS檔案中定義你自己的樣式。
預設情況下,樣式的範圍是你的web部件,你可以看到定義在.helloWorld下的樣式。
在.button樣式下新增下面的樣式:
.list {
color: #333333;
font-family: 'Segoe UI Regular WestEuropean', 'Segoe UI', Tahoma, Arial, sans-serif;
font-size: 14px;
font-weight: normal;
box-sizing: border-box;
margin: 10;
padding: 10;
line-height: 50px;
list-style-type: none;
box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1);
}
.listItem {
color: #333333;
vertical-align: center;
font-family: 'Segoe UI Regular WestEuropean', 'Segoe UI', Tahoma, Arial, sans-serif;
font-size: 14px;
font-weight: normal;
box-sizing: border-box;
margin: 0;
padding: 0;
box-shadow: none;
*zoom: 1;
padding: 9px 28px 3px;
position: relative;
}
儲存檔案,gulp會馬上將程式碼重新編譯,這也會在HelloWorld.module.scss.ts檔案中同時生成相應的型別。一旦編譯為typescript,你就能在你的web部件程式碼中匯入並引用這些樣式了。
你可以看到web部件中的render方法。
<div class="${styles.container}">
獲取展示列表資訊的方法
開啟HelloWorldWebPart類檔案。SharePoint工作臺提供了足夠的靈活性,使你可以在本地環境和SharePoint中測試web部件。SharePoint Framework旨在藉助這種能力通過使用EnvironmentType模組幫助你瞭解你的web部件執行在哪個環境。
你首先需要從@microsoft/sp-client-base包中匯入EnvironmentType模組,將下面的程式碼新增到匯入部分:
import { EnvironmentType } from '@microsoft/sp-client-base';
將下面的私有方法新增到HelloWorldWebPart類中去呼叫各自的方法獲取列表資料:
private _renderListAsync(): void {
// Local environment
if (this.context.environment.type === EnvironmentType.Local) {
this._getMockListData().then((response) => {
this._renderList(response.value);
}); }
else {
this._getListData()
.then((response) => {
this._renderList(response.value);
});
}
}
關於_renderListAsync方法中承載型別的說明:
>this.context.environment.type屬性會幫助你檢查當前是處在本地環境還是SharePoint環境。
>呼叫哪個方法取決於你的工作臺在哪承載。
>目前會提示_renderList找不到,不要著急,下面會補全。
儲存檔案,現在你需要將從REST API獲取到的列表資料展示出來。將下面的私有方法新增到HelloWorldWebPart類中:
private _renderList(items: ISPList[]): void {
let html: string = '';
items.forEach((item: ISPList) => {
html += `
<ul class="${styles.list}">
<li class="${styles.listItem}">
<span class="ms-font-l">${item.Title}</span>
</li>
</ul>`;
});
const listContainer: Element = this.domElement.querySelector('#spListContainer');
listContainer.innerHTML = html;
}
該方法通過styles這個變數引用了之前新新增的CSS樣式,儲存檔案,沒有問題的話會彈出一個編譯成功的提示。
獲取列表資料
定位到render方法,然後用下面的程式碼替換原來的內容:
this.domElement.innerHTML = `
<div class="${styles.helloWorld}">
<div class="${styles.container}">
<div class="ms-Grid-row ms-bgColor-themeDark ms-fontColor-white ${styles.row}">
<div class="ms-Grid-col ms-u-lg10 ms-u-xl8 ms-u-xlPush2 ms-u-lgPush1">
<span class="ms-font-xl ms-fontColor-white">Welcome to SharePoint!</span>
<p class="ms-font-l ms-fontColor-white">Customize SharePoint experiences using Web Parts.</p>
<p class="ms-font-l ms-fontColor-white">${this.properties.description}</p>
<p class="ms-font-l ms-fontColor-white">${this.properties.test2}</p>
<p class='ms-font-l ms-fontColor-white'>Loading from ${this.context.pageContext.web.title}</p>
<a href="https://github.com/SharePoint/sp-dev-docs/wiki" class="ms-Button ${styles.button}">
<span class="ms-Button-label">Learn more</span>
</a>
</div>
</div>
<div id="spListContainer" />
</div>
</div>`;
this._renderListAsync();
儲存檔案,同樣gulp serve會自動進行編譯,確保沒有發生任何錯誤。
切換到你的本地工作臺,新增HelloWorld的web部件,你會看到返回的模擬資料,如下圖:
接下來訪問SharePoint承載的工作臺,效果如下圖:
現在你可以暫時停止gulp serve的執行了,切換到命令列,用Ctrl+C來中斷gulp task。
下一步
恭喜你成功地在你的web部件中連線了SharePoint的資料。在下一講我們將繼續深入講解,如何將web部件部署到一個傳統的SharePoint服務端頁面。
相關文章
- SharePoint Framework 把你的客戶端web部件部署到經典的SharePoint頁面Framework客戶端Web
- SharePoint Framework 配置你的SharePoint客戶端web部件開發環境Framework客戶端Web開發環境
- SharePoint Framework 構建你的第一個web部件(三)FrameworkWeb
- SharePoint Framework 構建你的第一個web部件(一)FrameworkWeb
- SharePoint Framework 構建你的第一個web部件(二)FrameworkWeb
- SharePoint Framework 向web部件中新增外部庫FrameworkWeb
- SharePoint Framework 在web部件中使用已存在的JavaScript庫 - JavaScript庫的格式FrameworkWebJavaScript
- SharePoint Framework 配置Office 365開發者租戶Framework
- SharePoint Framework 在web部件中使用已存在的JavaScript庫 - 捆綁打包和外部引用FrameworkWebJavaScript
- SharePoint Framework 概述Framework
- impala客戶端連線客戶端
- Redis客戶端連線Redis客戶端
- 客戶端怎麼連線到伺服器?客戶端伺服器
- 配置ORACLE 客戶端連線到資料庫Oracle客戶端資料庫
- 客戶端段建立到伺服器端的連線過程客戶端伺服器
- SharePoint Framework Extensions GA ReleaseFramework
- mysql、redis 客戶端連線池MySqlRedis客戶端
- vncserver建立與客戶端連線VNCServer客戶端
- 使用 Java 客戶端透過 HTTPS 連線到 EasysearchJava客戶端HTTP
- 客戶端連線資料庫的方法客戶端資料庫
- SharePoint Framework 開發工具和庫Framework
- SharePoint Framework 企業嚮導(七)Framework
- SharePoint Framework 企業嚮導(六)Framework
- SharePoint Framework 企業嚮導(八)Framework
- SharePoint Framework 企業嚮導(三)Framework
- SharePoint Framework 企業嚮導(四)Framework
- SharePoint Framework 企業嚮導(二)Framework
- SharePoint Framework 企業嚮導(一)Framework
- SharePoint Framework 企業嚮導(五)Framework
- SharePoint Framework 企業嚮導(十)Framework
- SharePoint Framework 企業嚮導(九)Framework
- Redis客戶端連線數DevOpsRedis客戶端dev
- 從客戶端連線ASM例項客戶端ASM
- Oracle 19c中連線RMAN客戶端的連線方法Oracle客戶端
- MySQL client客戶端的四種連線方式MySqlclient客戶端
- Java 客戶端 Jedis和JedisPool 連線池Java客戶端
- Oracle客戶端連線伺服器教程Oracle客戶端伺服器
- 客戶端連線故障檢查流程手段客戶端