Teams Tab App 代碼深入淺出 - 配置頁面

上一篇文章我們使用Teams Toolkit 來創建、運行 tab app。這篇文章我們深入來分析看一下tab app 的代碼。

先打開代碼目錄,可以看到在 src 目錄下有入口文件?index.tsx,然后在?components?目錄下有更多的一些 tsx 文件,tsx 是 typescript的一種擴展文件,主要用于 react 開發。

我們打開?index.tsx,看一下代碼。

import React from "react";
import ReactDOM from "react-dom";
import App from "./components/App";
import "./index.css";ReactDOM.render(<App />, document.getElementById("root"));

可以看到代碼極其簡單明了,就是一個?<App>,那我們就打開?App.tsx?看看。

import { Provider, teamsTheme } from "@fluentui/react-northstar";
import Privacy from "./Privacy";
import TermsOfUse from "./TermsOfUse";
import Tab from "./Tab";
import TabConfig from "./TabConfig";
import { useTeams } from "msteams-react-base-component";.........export default function App() {const { theme } = useTeams({})[0];return (<Provider theme={theme || teamsTheme} styles=><Router><Route exact path="/"><Redirect to="/tab" /></Route><><Route exact path="/privacy" component={Privacy} /><Route exact path="/termsofuse" component={TermsOfUse} /><Route exact path="/tab" component={Tab} /><Route exact path="/config" component={TabConfig} /></></Router></Provider>);
}

App.tsx?也算簡單,有幾個地方需要我們注意的,第一個就是調用了?useTeams()?方法來獲取當前的 teams 的theme,teams實際上有幾個不同的theme,調用 “msteams-react-base-component” 的?useTeams()?就能夠拿到當前的 theme,然后把 theme 設置給了 Provider,在 Router方面則一看就明白,配置了一些路徑和對應的 component。

這些路徑實際上在 manifest.json 里有用到。我們打開?/build/appPackage/manifest.local.json?文件,我們可以看到:

{..."developer": {"name": "Teams App, Inc.","websiteUrl": "https://localhost:53000","privacyUrl": "https://localhost:53000/index.html#/privacy","termsOfUseUrl": "https://localhost:53000/index.html#/termsofuse"},"configurableTabs": [{"configurationUrl": "https://localhost:53000/index.html#/config","canUpdateConfiguration": true,"scopes": ["team","groupchat"]}],"staticTabs": [{"entityId": "index","name": "Personal Tab","contentUrl": "https://localhost:53000/index.html#/tab","websiteUrl": "https://localhost:53000/index.html#/tab","scopes": ["personal"]}],....
}

Privacy.tsx?和?TermsOfUse.tsx?非常簡單,我們不在展開,我們先來看一下?TabConfig.tsx。簡化后的內容如下:

import { app, pages } from "@microsoft/teams-js";class TabConfig extends React.Component {render() {app.initialize().then(() => {pages.config.registerOnSaveHandler((saveEvent) => {const baseUrl = `https://${window.location.hostname}:${window.location.port}`;pages.config.setConfig({suggestedDisplayName: "My Tab",entityId: "Test",contentUrl: baseUrl + "/index.html#/tab",websiteUrl: baseUrl + "/index.html#/tab",}).then(() => {saveEvent.notifySuccess();});});pages.config.setValidityState(true);});return (<div>...</div>);}
}

這個基本是 tab 配置頁面的標準寫法,調用?app.initialize()?方法,然后注冊一個 “Save” buttton 的回調函數,在這個回調函數里,調用?pages.config.setConfig()?函數來告訴 Teams,我們新建的tab的配置,新建的tab 的url是什么。

注冊完后,調用了?pages.config.setValidityState(true);?來告訴 Teams,我們的 config 頁面已經配置好了,可以讓用戶來點擊 Save 按鈕了。這里面有點繞,但如果各位仔細看上面的代碼,也不難理解。

我們再來整理一下這個流程:

    app.initialize().then(() => {pages.config.registerOnSaveHandler((saveEvent) => { // 注冊回調函數,當用戶點擊 Save 按鈕時,這個方法會被觸發const baseUrl = `https://${window.location.hostname}:${window.location.port}`;pages.config.setConfig({  // 告訴 Teams 新建的 tab 的具體情況,比如tab 名字和 urlsuggestedDisplayName: "My Tab",entityId: "Test",contentUrl: baseUrl + "/index.html#/tab",websiteUrl: baseUrl + "/index.html#/tab",}).then(() => {saveEvent.notifySuccess(); // 告訴 Teams,Save點擊事件處理完畢});});pages.config.setValidityState(true); // 告訴 Teams可以允許用戶點擊 Save 按鈕});return (<div>...</div> // 返回 config 頁面的 html 內容);

*/index.html#/tab?對應到的是 Tab component,對于 Tab 具體頁面里基本都是React的一些寫法,我這里就不再展開講 React 開發了,值得一提的是,我們應該盡量使用?fluentui?和?msteams-react-base-component?庫,讓使用 React 開發teams tab更加方便,并且風格和teams更加一致。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277808.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277808.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277808.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

labelme標注的json文件數據轉成coco數據集格式(可處理目標框和實例分割)

這里主要是搬運一下能找到的 labelme標注的json文件數據轉成coco數據集格式&#xff08;可處理目標框和實例分割&#xff09;的代碼&#xff0c;以供需要時參考和提供相關幫助。 1、官方labelme實現 如下是labelme官方網址&#xff0c;提供了源代碼&#xff0c;以及相關使用方…

EpSON TM-82II驅動在POS系統上面安裝問題處理

按照品牌名稱&#xff0c;在網上下載的安裝包為apstmt82.rar 下面講解一下&#xff0c;如何的解決愛普生打印機在POS機器上面的安裝問題&#xff0c;這個算是一個比較奇特的故障問題&#xff0c;不像其它的新北冰洋&#xff08;SN3C&#xff09;的U80_U80II&#xff0c;SeNor的…

打印圖片的屬性和實現另存圖片功能以及使用numpy

上一篇我們已經學了如何讀取圖片的功能了以及和opencv的環境搭建了&#xff0c;今天接著來學習&#xff0c;哈哈哈&#xff0c;今天剛好五一&#xff0c;也沒閑著&#xff0c;繼續學習。 1、 首先我們來實現打印出圖片的一些屬性功能&#xff0c; 先來看一段代碼&#xff1a; 1…

Ubuntu 18.04下命令安裝VMware Tools

2019獨角獸企業重金招聘Python工程師標準>>> sudo apt-get upgrade sudo apt-get install open-vm-tools-desktop -y sudo reboot 轉載于:https://my.oschina.net/u/574036/blog/1829455

phpstorm PHP language level無法選擇

phpstorm PHP7新特性一直提示紅色波浪線&#xff0c;應該是沒有設置PHP 版本&#xff0c;但是打開PHPstorm---preference--lannguage&frameworks--PHP &#xff0c; 發現PHP language level 無法選擇PHP7.2 &#xff0c;查看旁邊的提示信息說是同步了composer 的原因&#…

Qfile

打開方式&#xff1a; 1 void AddStudents::write_to_file(QString src){2 QFile file("stu.txt");3 if (!file.open(QIODevice::Append | QIODevice::Text)){4 QMessageBox::critical(this,"打開文件錯誤","確認");5 r…

多層裝飾器、帶參數裝飾器

# 帶參數的裝飾器 # import time # FLAGE False # 加個標志位&#xff0c;使全部的裝飾器可以失效或有效 # def timmer_out(flag): # def timmer(func): # def inner(*args,**kwargs): # if flag: # start time.time() # …

IDEA svn 菜單不見了,解決方法

2019獨角獸企業重金招聘Python工程師標準>>> 參考地址: http://www.cnblogs.com/signheart/p/193448a98f92bd0cc064dbd772dd9f48.html,我是第二種方法解決的! 轉載于:https://my.oschina.net/liuchangng/blog/1829679

蘇寧易購:Hadoop失寵前提是出現更強替代品

在筆者持續調研國內Hadoop生態系統生存現狀的同時&#xff0c;KDnuggets發布的2018年數據科學和機器學習工具調查報告再次將“Hadoop失寵”言論復活。報告一出&#xff0c;“Hadoop被拋棄”幾個字瞬時成為各大標題黨的最愛&#xff0c;充斥在不同的新聞平臺。這些報告和數據是否…

VS2017生成一個簡單的DLL文件 和 LIB文件——C語言

下面我們將用兩種不同的姿勢來用VS2017生成dll文件&#xff08;動態庫文件&#xff09;和lib文件&#xff08;靜態庫文件&#xff09;&#xff0c;這里以C語言為例&#xff0c;用最簡單的例子&#xff0c;來讓讀者了解如何生成dll文件&#xff08;動態庫文件&#xff09; 生成動…

Hive數據類型及文本文件數據編碼

本文參考Apache官網&#xff0c;更多內容請參考&#xff1a;https://cwiki.apache.org/confluence/display/Hive/LanguageManualTypes 1. 數值型 類型支持范圍TINYINT1-byte signed integer, from -128 to 127SMALLINT2-byte signed integer, from -32,768 to 32,767INT/INTEGE…

Python繪圖Turtle庫詳解

轉載&#xff1a;https://blog.csdn.net/zengxiantao1994/article/details/76588580 Turtle庫是Python語言中一個很流行的繪制圖像的函數庫&#xff0c;想象一個小烏龜&#xff0c;在一個橫軸為x、縱軸為y的坐標系原點&#xff0c;(0,0)位置開始&#xff0c;它根據一組函數指令…

(待完成)qbxt2019.05 總結2 - 數位DP

數位 DP 嚴格來說其實并不是 DP……它只是個單純的計數問題 但是怎么說呢……現在大家似乎都把數位 DP 叫這個名字&#xff0c;所以……我們還是……叫它 DP 額什么是數位 DP 呢&#xff1f; 一句話概括——一類求在 K 進制下m滿足條件的數的數量有多少個的算法 常見的問題形式…

mac使用brew update無反應解決辦法

為什么80%的碼農都做不了架構師&#xff1f;>>> mac系統中使用brew作為包管理工具&#xff0c;類似centos中的yum&#xff0c;ubuntu中的apt-get&#xff0c;在使用brew update的使用&#xff0c;有時候會長時間無反應&#xff0c;或者中途斷開連接&#xff0c;這是…

2018-2019-2 20175223 實驗三《敏捷開發與XP實踐》實驗報告

目錄 北京電子科技學院&#xff08;BESTI&#xff09;實驗報告實驗名稱&#xff1a;實驗三 敏捷開發與XP實踐實驗內容、步驟與體會&#xff1a;一、實驗三 敏捷開發與XP實踐-1二、實驗三 敏捷開發與XP實踐-2三、實驗三 敏捷開發與XP實踐-3四、實驗三 敏捷開發與XP實踐-4五、代碼…

(八)路徑(面包屑導航)分頁標簽和徽章組件

一&#xff0e;路徑組件 路徑組件也叫做面包屑導航。 <ol class"breadcrumb"><li><a href"#">首頁</a></li><li><a href"#">產品列表</a></li><li><a href"#">大…

第十周總結

失望光年轉載于:https://www.cnblogs.com/daisy99lijing/p/11064924.html

LC #45 JS

效率低下 最起碼容易看得懂&#xff1f;將就看吧 /*** param {number[]} nums* return {number}*/ var jump function(nums) {let len nums.length;if(len < 1){return 0;}function calPossibleLastStep(index){let res [];if(index > len){return res;}if(index <…

python之爬蟲(四)之 Requests庫的基本使用

什么是Requests Requests是用python語言基于urllib編寫的&#xff0c;采用的是Apache2 Licensed開源協議的HTTP庫如果你看過上篇文章關于urllib庫的使用&#xff0c;你會發現&#xff0c;其實urllib還是非常不方便的&#xff0c;而Requests它會比urllib更加方便&#xff0c;可以…

https://blog.csdn.net/cscscscsc/article/details/50

https://blog.csdn.net/cscscscsc/article/details/50899522轉載于:https://blog.51cto.com/7237876/2129682