1. 程式人生 > >SharePoint framework學習筆記——實現bootstrap輪播效果

SharePoint framework學習筆記——實現bootstrap輪播效果

ots += [] http true ble work erb sequence

要實現的效果:根據不同列表名查詢不同的輪播數據

數據從SharePoint站點查詢出

技術分享圖片

項目目錄:

技術分享圖片

站點數據:

技術分享圖片

1. 創建spfx項目:詳見SharePoint framework學習筆記——創建spfx項目

2. 引入jQuery和bootstrap

  2.1 在config.json中的“externals”中添加jQuery和bootstrap

  註意:path可直接使用CDN也可以用本地的路徑,如使用CDN需確定是否是可使用的CDN

"externals": {
    "jquery": {
      "path": "https://code.jquery.com/jquery-1.12.4.min.js",
      
"globalName": "jquery" }, "bootstrap": { "path": "https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js", "globalName": "bootstrap", "globalDependencies": ["jquery"] } }

  2.2 在BannerWebPart.ts文件的最後一個import後添加引入在config.json聲明的依賴

  註:引入方式最後如下順序,之前引入bootstrap一直提示沒有bootstrap,FQ查閱了很多資料很多寫法都是如下寫法。

import ‘jquery‘;
require(‘bootstrap‘);

  2.3 引入bootstrap的樣式文件

import { SPComponentLoader } from ‘@microsoft/sp-loader‘;

  方法一:

protected onInit(): Promise<void> {
    SPComponentLoader.loadCss(‘https://pttlab.sharepoint.com/:u:/r/sites/CFLPortal/Style/bootstrap.min.css?csf=1&e=8GXv2Q‘);
    SPComponentLoader.loadCss(‘https://pttlab.sharepoint.com/:u:/r/sites/CFLPortal/Style/banner.css?csf=1
&e=DwauKt‘); return super.onInit(); }

  方法二:在render()中使用

let cssURL = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css Jump ";
SPComponentLoader.loadCss(cssURL);

  方法三:詳見SharePoint framework學習筆記——使用第三方插件

3. 獲取站點的數據:詳細介紹見SharePoint Framework學習筆記——根據官方文檔查詢列表內容並部署

  直接貼代碼

  BannerWeb.ts

import { Version } from ‘@microsoft/sp-core-library‘;
import {
  BaseClientSideWebPart,
  IPropertyPaneConfiguration,
  PropertyPaneTextField
} from ‘@microsoft/sp-webpart-base‘;
import { escape } from ‘@microsoft/sp-lodash-subset‘;

import styles from ‘./BannerWebPart.module.scss‘;
import * as strings from ‘BannerWebPartStrings‘;

import { SPComponentLoader } from ‘@microsoft/sp-loader‘;

import { Environment,EnvironmentType, Log} from ‘@microsoft/sp-core-library‘;
import { SPHttpClient, SPHttpClientResponse } from ‘@microsoft/sp-http‘;

import ‘jquery‘;
require(‘bootstrap‘);

export interface IBannerWebPartProps {
  listName: string;
}

export interface BannerLists{
  value: BannerList[];
}
export interface BannerList{
  Id:string;
  Title:string;
  ImageURL:URL;
  DisplayText:string;
  Enabled:boolean;
  Sequence:number;
  URL:URL;
}

export default class BannerWebPart extends BaseClientSideWebPart<IBannerWebPartProps> {

  public render(): void {
    this.domElement.innerHTML = `

    <div id="carousel-example-generic" class="carousel slide" style=‘margin-bottom:20px;‘ data-ride="carousel">
        <ol class="carousel-indicators" id="bannerOl" style=‘bottom:-35px;‘>

        </ol>
      
        <div class="carousel-inner" role="listbox" id="bannerImg">
          
        </div>
      
        <a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
          <span aria-hidden="true" class=‘leftOrRight‘ style=‘left:0;width:48px;‘><img src=‘https://pttlab.sharepoint.com/:i:/r/sites/CFLPortal/Style/icon/left.png?csf=1&e=cawgON‘ /></span>
          <span class="sr-only">Previous</span>
        </a>
        <a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
          <span aria-hidden="true" class=‘leftOrRight‘><img src=‘https://pttlab.sharepoint.com/:i:/r/sites/CFLPortal/Style/icon/right.png?csf=1&e=anYPXW‘ /></span>
          <span class="sr-only">Next</span>
        </a>
      </div>
      
      `;

      this._renderListAsync();
  }


  protected onInit(): Promise<void> {
    SPComponentLoader.loadCss(‘https://pttlab.sharepoint.com/:u:/r/sites/CFLPortal/Style/bootstrap.min.css?csf=1&e=8GXv2Q‘);
    SPComponentLoader.loadCss(‘https://pttlab.sharepoint.com/:u:/r/sites/CFLPortal/Style/banner.css?csf=1&e=DwauKt‘);
    return super.onInit();
  }

  private _getListData(): Promise<BannerLists>{
    const queryString: string = ‘$select=Title,ImageURL,Sequence,Id,Enabled,DisplayText,URL,Author/ID,Author/Title&$expand=Author/ID‘+
    ‘,Author/Title&$orderby=Sequence asc‘;

    return this.context.spHttpClient
    .get(`${this.context.pageContext.web.absoluteUrl}/_api/web/lists/GetByTitle(‘${this.properties.listName}‘)/items?${queryString}`,
    SPHttpClient.configurations.v1)
    .then((response: SPHttpClientResponse) => {
      if(response.status === 404){
        Log.error(‘DisplayList-webPart‘, new Error(‘List not found.‘));
        return [];
      } else {
        return response.json();
      }
    });

  }

  private _renderListAsync(): void {
    if(this.properties.listName==‘‘|| this.properties.listName==null){
      return;
    }
    this._getListData()
      .then((response) => {
        this._renderList(response.value);
      });
  }

  private _renderList(items: BannerList[]):void{
    let html: string = ‘‘;
    let ols: string = ‘‘;
    items.forEach((item: BannerList) => {
      let title: string = ‘‘;
      if(item.Title == null){
          title = ‘Missing title for item with ID = ‘+ item.Title;
      } else {
        title = item.Title;
      }
      let ImageURL: any = item.ImageURL;
      let URL: any = item.URL;
      let OrderSeq: number;
      let Sequence: number = item.Sequence;
      let Enabled: boolean;
      let display: string;
      let DisplayText: string = item.DisplayText;
      Enabled = item.Enabled;
      if(!Enabled){
        display = "display: none;";
      } else {
        display = "";
      }


      let created: any = item[‘created‘];
      //html += `<li><img src=‘${item.ImageURL}‘ /></li>`;
      //ols += ``;

      if((DisplayText==‘‘ || DisplayText ==null) && Sequence==1 && Enabled!=false){
        html += `<div class=‘item active‘><img src=‘${ImageURL.Url}‘ /><div class=‘img_title‘ style=‘background:rgba(0,0,0,0)‘>${DisplayText}</div></div>`;
        ols += `<li class=‘active‘ data-target=‘#carousel-example-generic‘ data-slide-to=‘${item.Id}‘></li>`;
      } else if((DisplayText!=‘‘ || DisplayText!=null) && Sequence==1 && Enabled!=false){
        html += `<div class=‘item active‘><img src=‘${ImageURL.Url}‘ /><div class=‘img_title‘>${DisplayText}</div></div>`;
        ols += `<li class=‘active‘ data-target=‘#carousel-example-generic‘ data-slide-to=‘${item.Id}‘></li>`;
      } else if((DisplayText!=‘‘ || DisplayText!=null) && Sequence!=1 && Enabled!=false) {
        html += `<div class=‘item‘><img src=‘${ImageURL.Url}‘ /><div class=‘img_title‘>${DisplayText}</div></div>`;
        ols += `<li data-target=‘#carousel-example-generic‘ data-slide-to=‘${item.Id}‘></li>`;
      } else if((DisplayText==‘‘ || DisplayText ==null) && Sequence!=1 && Enabled!=false) {
        html += `<div class=‘item‘><img src=‘${ImageURL.Url}‘ /><div class=‘img_title‘ style=‘background:rgba(0,0,0,0)‘>${DisplayText}</div></div>`;
        ols += `<li data-target=‘#carousel-example-generic‘ data-slide-to=‘${item.Id}‘></li>`;
      }

      

    })
    const listContainer: Element = this.domElement.querySelector(‘#bannerImg‘);
    const loContainer: Element = this.domElement.querySelector(‘#bannerOl‘);
    listContainer.innerHTML = html;
    loContainer.innerHTML = ols;
  }

  protected get disableReactivePropertyChanges(): boolean{
    return true;
  }

  protected get dataVersion(): Version {
    return Version.parse(‘1.0‘);
  }

  protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration {
    return {
      pages: [
        {
          header: {
            description: strings.PropertyPaneDescription
          },
          groups: [
            {
              groupName: strings.BasicGroupName,
              groupFields: [
                PropertyPaneTextField(‘listName‘, {
                  label: ‘list name‘
                })
              ]
            }
          ]
        }
      ]
    };
  }
}

  註:代碼中”queryString“裏的內容為要查詢出的數據,可以理解為sql語句。

  config.json

{
  "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json",
  "version": "2.0",
  "bundles": {
    "banner-web-part": {
      "components": [
        {
          "entrypoint": "./lib/webparts/banner/BannerWebPart.js",
          "manifest": "./src/webparts/banner/BannerWebPart.manifest.json"
        }
      ]
    }
  },
  "externals": {
    "jquery": {
      "path": "https://code.jquery.com/jquery-1.12.4.min.js",
      "globalName": "jquery"
    },
    "bootstrap": {
      "path": "https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js",
      "globalName": "bootstrap",
      "globalDependencies": ["jquery"]
    }
  },
  "localizedResources": {
    "BannerWebPartStrings": "lib/webparts/banner/loc/{locale}.js"
  }
}

  

SharePoint framework學習筆記——實現bootstrap輪播效果