one-stop-interaction 一站式互动组件

基础库 3.180.3 开始支持,低版本需做兼容处理

解释:一站式互动组件,为开发者提供一整套包含评论发布器、评论列表及详情、点赞、收藏、转发功能的互动 bar 能力,互动 bar 支持自定义,此外还提供数据存储、数据内容审核、用户接收百度 App 消息通知的一站式服务。

使用了原 smart-sc 动态库引入的方式,请迁移到如下新的动态库方式接入。

使用方式

1.在项目中声明引用 swan-interaction 动态库

在 app.json 文件配置的 dynamicLib 字段中增加对 swan-interaction 的引用,具体格式在使用动态库文档中查看。

  • JSON
  1. "dynamicLib": {
  2. // 'myDynamicLib' 是个可自定义的别名。
  3. "myDynamicLib": {
  4. // provider 是要引用的动态库的名字,在此为 'swan-interaction'。
  5. "provider": "swan-interaction"
  6. }
  7. }

2.创建一个带评论功能的页面,并在页面中声明引用 comment-list 组件
动态库中的组件与其他自定义组件类似,都需要在 page 中使用。所以首先需要创建一个 page,page 路径可自定义,推荐路径为 pages/list/index(即在小程序页面目录 pages 下创建 list 文件夹,并在文件夹下创建 index.js、index.swan、index.css、index.json 页面文件)。

页面中引用动态库组件的方式是:在页面的 json 配置的 usingSwanComponents 字段中声明组件引用。

  • JSON
  1. {
  2. "navigationBarTitleText": "评论列表",
  3. "usingSwanComponents": {
  4. "comment-list": "dynamicLib://myDynamicLib/comment-list"
  5. }
  6. }

在页面中放入列表组件,传入必要的参数,组件详情配置请参考 comment-list 评论列表组件

  • SWAN
  • JS
  • CSS
  1. <view>
  2. <view class="article-header">
  3. <text class="title" selectable="true">{{header.title}}</text>
  4. <view class="source">
  5. <image s-if="!!header.avatar" src="{{header.avatar}}"/>
  6. <view class="info">
  7. <text class="author">{{header.author}}</text>
  8. <text class="time">{{header.time}}</text>
  9. </view>
  10. </view>
  11. </view>
  12. <view class="article-content">
  13. <block s-for="{{content.items}}" s-for-index="eleIndex">
  14. <block s-if="{{item.type === 'text'}}">
  15. <view class="content-p" data-index="{{eleIndex}}">
  16. <text selectable="true">{{item.data}}</text>
  17. </view>
  18. </block>
  19. <block s-elif="{{item.type === 'image'}}">
  20. <image
  21. class="content-img"
  22. src="{{item.data.src}}"
  23. original-src="{{item.data.src}}"
  24. mode="widthFix"
  25. preview="true"
  26. lazy-load="true"/>
  27. </block>
  28. </block>
  29. </view>
  30. <view>欢迎使用智能小程序动态库
  31. 欢迎使用智能小程序动态库
  32. 欢迎使用智能小程序动态库</view>
  33. <image src="https://b.bdstatic.com/miniapp/images/demo-dog.png"
  34. class="img"></image>
  35. <view>欢迎使用智能小程序动态库
  36. 欢迎使用智能小程序动态库
  37. 欢迎使用智能小程序动态库</view>
  38. <!-- 评论列表组件 -->
  39. <comment-list class="list"
  40. comment-param="{{commentParam}}"
  41. detail-path="{{detailPath}}"
  42. toolbar-config="{{toolbarConfig}}"
  43. bindclickcomment="clickComment">
  44. </comment-list>
  45. </view>
  1. Page({
  2. data: {
  3. commentParam: {},
  4. header: {
  5. title: '心疼!中国自行车女将卷入摔车事故 腹部扎入3厘米木刺坚持完赛',
  6. avatar: 'https://b.bdstatic.com/miniapp/images/demo-dog.png',
  7. author: '百度智能小程序',
  8. time: '2020年04月14日'
  9. },
  10. content: {
  11. items: [
  12. {
  13. type: 'text',
  14. data: '测试文字'
  15. }
  16. ]
  17. },
  18. detailPath: '/pages/detail/index?params1=abd',
  19. // 底部互动 bar 的配置
  20. toolbarConfig: {
  21. // 若 moduleList 中配置有 share 模块,默认是有,则该属性为必填,title 必传
  22. share: {
  23. title: '心疼!中国自行车女将卷入摔车事故 腹部扎入3厘米木刺坚持完赛'
  24. }
  25. }
  26. },
  27. onLoad(query) {
  28. this.setData({
  29. commentParam: {
  30. snid: '10070000311753961',
  31. path: '/pages/comment/index?snid=test_snid57',
  32. title: '测试文章标题',
  33. content: '测试文章内容',
  34. images: ['https://b.bdstatic.com/miniapp/images/demo-dog.png']
  35. }
  36. });
  37. },
  38. onReady() {
  39. // 用于实现页面间的跳转
  40. requireDynamicLib('myDynamicLib').listenEvent();
  41. },
  42. clickComment(e) {
  43. }
  44. });
  1. .article-header {
  2. padding: 0 17px;
  3. }
  4. .article-header .title {
  5. display: block;
  6. font-size: 24px;
  7. line-height: 1.5;
  8. font-weight: 700;
  9. }
  10. .article-header .source {
  11. margin-top: 24px;
  12. display: flex;
  13. align-items: flex-start;
  14. }
  15. .article-header .source image {
  16. width: 35px;
  17. height: 35px;
  18. border-radius: 100%;
  19. margin-right: 8px;
  20. background-color: #eef1f4;
  21. background-size: 16px 16px;
  22. background-repeat: no-repeat;
  23. background-position: center center;
  24. background-image: url(../common/assets/logo-default.png);
  25. }
  26. .article-header .info {
  27. display: flex;
  28. flex-direction: column;
  29. justify-content: center;
  30. height: 35px;
  31. }
  32. .article-header .info .author {
  33. font-size: 16px;
  34. line-height: 1;
  35. display: block;
  36. color: #000;
  37. margin-bottom: 7px;
  38. }
  39. .article-header .info .time {
  40. display: block;
  41. color: #999;
  42. font-size: 12px;
  43. line-height: 1;
  44. }
  45. .article-content {
  46. color: #000;
  47. font-size: 19px;
  48. line-height: 1.58;
  49. letter-spacing: 2.84;
  50. margin-bottom: 30px;
  51. }
  52. .article-content .content-img {
  53. width: 100%;
  54. margin-top: 30px;
  55. vertical-align: bottom;
  56. background-color: #eef1f4;
  57. background-size: 32px 32px;
  58. background-repeat: no-repeat;
  59. background-position: center center;
  60. background-image: url(../common/assets/logo-default.png);
  61. }
  62. .article-content .content-p {
  63. margin: 24.5px 17px -5.5px 17px;
  64. text-align: justify;
  65. word-break: break-all;
  66. }

3.创建一个评论详情页面,并在页面中声明引用 comment-detail 组件
动态库中的组件与其他自定义组件类似,都需要在 page 中使用。所以首先需要创建一个 page,page 路径可自定义,推荐路径为 pages/detail/index(即在小程序页面目录 pages 下创建 detail 文件夹,并在文件夹下创建 index.js、index.swan、index.css、index.json 页面文件)。

页面中引用动态库组件的方式是:在页面的 json 配置的 usingSwanComponents 字段中声明组件引用。

  • JSON
  1. {
  2. "navigationBarTitleText": "评论详情",
  3. "usingSwanComponents": {
  4. "comment-detail": "dynamicLib://myDynamicLib/comment-detail"
  5. }
  6. }

在页面中放入详情组件,传入必要的参数,组件详情配置请参考 comment-detail 评论详情组件

  • SWAN
  • JS
  1. <comment-detail
  2. comment-param="{{commentParam}}"
  3. srid="{{srid}}"
  4. need-like-btn="{{true}}"
  5. binddelete="detailDelete">
  6. </comment-detail>
  1. Page({
  2. data: {
  3. srid: '',
  4. commentParam: {}
  5. },
  6. onLoad(options) {
  7. if (options) {
  8. this.setData({
  9. srid: options.srid
  10. });
  11. }
  12. const param = getApp().globalData.commentParam;
  13. if (param && Object.keys(param).length) {
  14. this.setData({
  15. 'commentParam': param
  16. });
  17. }
  18. else {
  19. this.setData({
  20. commentParam: {
  21. snid: '10070000311753961',
  22. path: '/pages/comment/index?snid=test_snid57',
  23. title: '测试文章标题'
  24. }
  25. });
  26. }
  27. }
  28. });

图片示例

one-stop-interaction 一站式互动 - 图1

评论列表支持折叠

对于部分开发者,在评论列表下方希望放入广告等推荐区域,故评论列表支持折叠使用。

使用方式

1.创建一个带评论功能的页面,并在页面中声明引用 comment-list 组件
在页面中放入列表组件,传入必要的可折叠参数,组件详情配置请参考 comment-list 评论列表组件

  • SWAN
  • JS
  • JSON
  • CSS
  1. <view>
  2. <view class="article-header">
  3. <text class="title" selectable="true">{{header.title}}</text>
  4. <view class="source">
  5. <image s-if="!!header.avatar" src="{{header.avatar}}"/>
  6. <view class="info">
  7. <text class="author">{{header.author}}</text>
  8. <text class="time">{{header.time}}</text>
  9. </view>
  10. </view>
  11. </view>
  12. <view class="article-content">
  13. <block s-for="{{content.items}}" s-for-index="eleIndex">
  14. <block s-if="{{item.type === 'text'}}">
  15. <view class="content-p" data-index="{{eleIndex}}">
  16. <text selectable="true">{{item.data}}</text>
  17. </view>
  18. </block>
  19. <block s-elif="{{item.type === 'image'}}">
  20. <image
  21. class="content-img"
  22. src="{{item.data.src}}"
  23. original-src="{{item.data.src}}"
  24. mode="widthFix"
  25. preview="true"
  26. lazy-load="true"/>
  27. </block>
  28. </block>
  29. </view>
  30. <!-- 评论列表支持折叠 -->
  31. <comment-list class="list"
  32. comment-param="{{commentParam}}"
  33. detail-path="{{detailPath}}"
  34. is-folded="{{true}}"
  35. fold-num="{{foldNum}}"
  36. toolbar-config="{{toolbarConfig}}"
  37. view-more-path="{{viewMorePath}}"
  38. bindclickcomment="clickComment"
  39. bindviewmore="viewMore">
  40. </comment-list>
  41. <view class="comment-list-folded-bottom-margin"></view>
  42. <view class="list-after">
  43. <view>欢迎使用智能小程序动态库
  44. 欢迎使用智能小程序动态库
  45. 欢迎使用智能小程序动态库</view>
  46. <image src="https://b.bdstatic.com/miniapp/images/demo-dog.png"
  47. class="img"></image>
  48. <view>欢迎使用智能小程序动态库
  49. 欢迎使用智能小程序动态库
  50. 欢迎使用智能小程序动态库</view>
  51. </view>
  52. </view>
  1. Page({
  2. data: {
  3. commentParam: {},
  4. header: {
  5. title: '心疼!中国自行车女将卷入摔车事故 腹部扎入3厘米木刺坚持完赛',
  6. avatar: 'https://b.bdstatic.com/miniapp/images/demo-dog.png',
  7. author: '百度智能小程序',
  8. time: '2020年04月14日'
  9. },
  10. content: {
  11. items: [
  12. {
  13. type: 'image',
  14. data: {
  15. src: 'https://b.bdstatic.com/miniapp/images/demo-dog.png'
  16. }
  17. },
  18. {
  19. type: 'text',
  20. data: '测试文字'
  21. }
  22. ]
  23. },
  24. // 评论详情页面路径
  25. detailPath: '/pages/detail/index?params1=abd',
  26. // 全部评论页面路径
  27. viewMorePath: '/pages/all-list/index',
  28. // 折叠展示最大评论条数
  29. foldNum: 5,
  30. // 底部互动 bar 的配置
  31. toolbarConfig: {
  32. // 若 moduleList 中配置有 share 模块,默认是有,则该属性为必填,title 必传
  33. share: {
  34. title: '心疼!中国自行车女将卷入摔车事故 腹部扎入3厘米木刺坚持完赛'
  35. }
  36. }
  37. },
  38. onLoad(query) {
  39. this.setData({
  40. commentParam: {
  41. snid: '10070000311753961',
  42. path: '/pages/comment/index?snid=test_snid57',
  43. title: '测试文章标题',
  44. content: '测试文章内容',
  45. images: ['https://b.bdstatic.com/miniapp/images/demo-dog.png']
  46. }
  47. });
  48. },
  49. onReady() {
  50. // 用于实现页面间的跳转
  51. requireDynamicLib('myDynamicLib').listenEvent();
  52. },
  53. clickComment(e) {
  54. },
  55. viewMore() {
  56. swan.showToast({
  57. title: 'click success'
  58. });
  59. }
  60. });
  1. {
  2. "navigationBarTitleText": "折叠列表页",
  3. "usingSwanComponents": {
  4. "comment-list": "dynamicLib://myDynamicLib/comment-list"
  5. }
  6. }
  1. .article-header {
  2. padding: 0 39.8rpx;
  3. }
  4. .article-header .title {
  5. display: block;
  6. font-size: 56rpx;
  7. line-height: 1.5;
  8. font-weight: 700;
  9. }
  10. .article-header .source {
  11. margin-top: 56rpx;
  12. display: flex;
  13. align-items: flex-start;
  14. }
  15. .article-header .source image {
  16. width: 82rpx;
  17. height: 82rpx;
  18. border-radius: 100%;
  19. margin-right: 18.7rpx;
  20. background-color: #eef1f4;
  21. background-size: 37.4rpx 37.4rpx;
  22. background-repeat: no-repeat;
  23. background-position: center center;
  24. background-image: url(../common/assets/logo-default.png);
  25. }
  26. .article-header .info {
  27. display: flex;
  28. flex-direction: column;
  29. justify-content: center;
  30. height: 82rpx;
  31. }
  32. .article-header .info .author {
  33. font-size: 37.4rpx;
  34. line-height: 1;
  35. display: block;
  36. color: #000;
  37. margin-bottom: 16.4rpx;
  38. }
  39. .article-header .info .time {
  40. display: block;
  41. color: #999;
  42. font-size: 28rpx;
  43. line-height: 1;
  44. }
  45. .article-content {
  46. color: #000;
  47. font-size: 44.5rpx;
  48. line-height: 1.58;
  49. letter-spacing: 2.84;
  50. margin-bottom: 70.2rpx;
  51. }
  52. .article-content .content-img {
  53. width: 100%;
  54. margin-top: 70.2rpx;
  55. vertical-align: bottom;
  56. background-color: #eef1f4;
  57. background-size: 74.9rpx 74.9rpx;
  58. background-repeat: no-repeat;
  59. background-position: center center;
  60. background-image: url(../common/assets/logo-default.png);
  61. }
  62. .article-content .content-p {
  63. margin: 57.3rpx 39.8rpx -12.9rpx 39.8rpx;
  64. text-align: justify;
  65. word-break: break-all;
  66. }
  67. .list-after {
  68. padding: 30rpx 18rpx 90rpx;
  69. }
  70. .comment-list-folded-bottom-margin {
  71. height: 14.4rpx;
  72. background-color: #f5f5f5;
  73. }

2.创建一个展示全部评论的页面,并在页面中声明引用 comment-list 组件
我们建议全部评论的页面,互动 bar 仅保留评论发布。组件配置请参考 comment-list 评论列表组件

  • SWAN
  • JS
  • JSON
  1. <comment-list
  2. comment-param="{{commentParam}}"
  3. detail-path="{{detailPath}}"
  4. toolbar-config="{{toolbarConfig}}"
  5. bindclickcomment="clickComment">
  6. </comment-list>
  1. Page({
  2. data: {
  3. commentParam: {},
  4. toolbarConfig: {
  5. moduleList: []
  6. },
  7. detailPath: '/pages/detail/index?params1=abd'
  8. },
  9. onInit() {
  10. this.isOnInitCalled = true;
  11. this.init();
  12. },
  13. onLoad() {
  14. // 兼容不支持 onInit 的版本
  15. if (!this.isOnInitCalled) {
  16. this.init();
  17. }
  18. },
  19. init() {
  20. const commentParam = getApp().globalData.commentParam;
  21. if (commentParam && Object.keys(commentParam).length) {
  22. this.setData({
  23. commentParam
  24. });
  25. }
  26. else {
  27. this.setData({
  28. commentParam: {
  29. snid: '10070000311753961',
  30. path: '/pages/comment/index?snid=test_snid57',
  31. title: '测试文章标题'
  32. }
  33. });
  34. }
  35. },
  36. onReady() {
  37. // 用于实现页面间的跳转
  38. requireDynamicLib('myDynamicLib').listenEvent();
  39. },
  40. clickComment(e) {
  41. }
  42. });
  1. {
  2. "navigationBarTitleText": "全部评论",
  3. "usingSwanComponents": {
  4. "comment-list": "dynamicLib://myDynamicLib/comment-list"
  5. }
  6. }

3.创建一个评论详情页面,并在页面中声明引用 comment-detail 组件

Bug & Tip

  • Tip:使用 Mars 等第三方框架开发小程序时,可能存在 setData 的异步延时,如在评论详情页 srid 作为单独参数传入没有生效,可作为 commentParam 中的字段传入。
  • Tip:原有一站式互动组件 smart-sc 因性能问题,对用户流量产生影响,为避免影响线上已接入用户,本次新的一站式互动组件采用新的动态库。
  • Tip:原有一站式互动组件的部分 bug ,如点赞状态失效等,已在新一站式组件中修复。
  • Tip:新的一站式互动组件,通用性更强,除了页面级别,也支持浮层的使用。
  • Tip:在 onLoad 和 onReady 生命周期内引入requireDynamicLib('myDynamicLib').listenEvent()来实现页面的跳转。