STAGE 04 — 4-2 / 実装する

リスト名を設定可能にする

考えてみよう

今のリストビューアは、リスト名が 'お知らせ' と直書きです。もし別のリストも映したくなったら、そのたびにコードを書き換える……のは、さすがに不便ですよね。どうすれば良いでしょう?

STAGE 03で学んだ プロパティペイン(設定パネル) の出番です。リスト名を「設定値」にすれば、コードを触らずに、配置した人が画面から変えられます。ここを仕上げると、部品が一気に"使える"ものになります。

① 設定値の置き場所を用意する

まず、Webパーツ本体が持つ設定値に listName を加えます。ListViewerWebPart.ts のプロパティ型を、こう変えます。

export interface IListViewerWebPartProps {
  listName: string;
}

② 直書きを、設定値に差し替える

前の記事で 'お知らせ' と直書きしていた render() を、設定値を使う形に変えます。

public render(): void {
  const element: React.ReactElement<IListViewerProps> =
    React.createElement(ListViewer, {
      context: this.context,
      listName: this.properties.listName   // ← 設定パネルの値を使う
    });
  ReactDom.render(element, this.domElement);
}

③ 設定パネルに入力欄を足す

getPropertyPaneConfiguration() に、リスト名を入力するテキストボックスを追加します。

protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration {
  return {
    pages: [{
      header: { description: '表示するリストを設定します' },
      groups: [{
        groupName: '基本設定',
        groupFields: [
          PropertyPaneTextField('listName', {
            label: '表示するリスト名'
          })
        ]
      }]
    }]
  };
}

PropertyPaneTextField('listName', ...)'listName' が、②のプロパティと名前でつながっています。ここに入力した文字が this.properties.listName に入る、という約束です。

④ 初期値を決めておく

配置した直後に空っぽだと寂しいので、初期値を入れます。ListViewerWebPart.manifest.jsonpreconfiguredEntries にある properties へ、既定のリスト名を書きます。

"preconfiguredEntries": [{
  "groupId": "...",
  "title": { "default": "ListViewer" },
  "description": { "default": "リストの中身を一覧表示します" },
  "properties": {
    "listName": "お知らせ"
  }
}]

これで、配置した瞬間から「お知らせ」を表示しつつ、設定パネルで別のリスト名にも変えられます。

⑤ リスト名が変わったら、取り直す

設定パネルでリスト名を変えたとき、表示も切り替わってほしいですよね。Reactコンポーネントに「リスト名が変わったら取り直す」処理を足します。ListViewer.tsx に次のメソッドを追加します。

public componentDidUpdate(prevProps: IListViewerProps): void {
  if (prevProps.listName !== this.props.listName) {
    this._loadItems();   // リスト名が変わったので取り直す
  }
}

componentDidMount(最初の1回)に加えて componentDidUpdate(変わったとき)でも取得することで、設定変更が即座に画面へ反映されます。

ゆみちゃん
ゆみ

これで部品として"完成形"に近づいたよ。ポイントは「名前でつなぐ」こと。②の listName プロパティ、③の PropertyPaneTextField('listName')、④の "listName": "お知らせ" ——全部おなじ listName で結ばれてる。名前を1つでも間違えるとつながらないから、そこだけ注意ね。

やってみよう

ここまで保存して、heft start のターミナルにエラーが出ていないか確認しましょう。エラーがなければ、実装は完了です。

確認ポイント

おつかれさまでした! これで「リストの中身を表示し、対象リストを設定パネルから選べる」Webパーツが完成しました。あとは実データで動くかを確かめるだけ。次のSTAGE 05で、ホストされたワークベンチを使って本物のお知らせを表示させます。

この記事のまとめ

Webパーツが完成しました。次は、これを実際のSharePointデータで動かして確かめます。

用語メモ
プロパティペイン
編集時に右から出る設定パネル。配置した人が値を変えられる
PropertyPaneTextField
プロパティペインに文字入力欄を追加する部品
preconfiguredEntries
manifest内の初期設定。配置直後の既定値を決める
componentDidUpdate
Reactでpropsやstateが変化した後に呼ばれるメソッド