sails.js之如何在sailsjs 中导入和使用常规的vuejs 组件

小虾米 阅读:222 2024-12-31 21:38:35 评论:0

我需要使用 vue 组件包作为带有sails 的npm 模块。

尝试了一切:

  • 无法将其导入页面实例,此处不允许导入;
  • 无法将其导入 parasails.registerCompnent,同样的错误;
  • 要求也不工作;
  • 在主 app.js 中导入它不起作用。

  • 到处看了看,真是令人沮丧,到处都没有任何信息。

    这是我后悔为我的项目选择风 sails 的时刻之一。

    任何人都有一个关于如何在sails 实例页面中使用npm pacages vue 组件的工作示例?

    请您参考如下方法:

    据我所知,您不能将组件作为包导入。你需要做的就是把 .Vue 文件的内容放到一个 parasails.registerComponent 文件中。使用assets/js/components 文件夹中的现有组件之一作为指导。你可能需要做一些摆弄。

    我举个例子:https://vuejs.org/v2/examples/grid-component.html

    我在welcome.ejs中放置了以下内容

    <!-- component template --> 
    <script type="text/x-template" id="grid-template"> 
      <table> 
        <thead> 
          <tr> 
            <th v-for="key in columns" 
              @click="sortBy(key)" 
              :class="{ active: sortKey == key }"> 
              {{key}} 
              <span class="arrow" :class="sortOrders[key] > 0 ? 'asc' : 'dsc'"> 
              </span> 
            </th> 
          </tr> 
        </thead> 
        <tbody> 
          <tr v-for="entry in filteredData"> 
            <td v-for="key in columns"> 
              {{entry[key]}} 
            </td> 
          </tr> 
        </tbody> 
      </table> 
    </script> 
     
    <!-- demo root element --> 
      <demo-grid 
        :data="gridData" 
        :columns="gridColumns" 
        :filter-key="searchQuery"> 
      </demo-grid> 
    

    我删除了搜索栏并大写过滤器以简化此示例(并使其正常工作)。

    我添加到welcome.page.js 中的数据部分
        index: 0, 
        entry: 0, 
        key: 0, 
        searchQuery: '', 
        gridColumns: ['name', 'power'], 
        gridData: [ 
          { name: 'Chuck Norris', power: Infinity }, 
          { name: 'Bruce Lee', power: 9000 }, 
          { name: 'Jackie Chan', power: 7000 }, 
          { name: 'Jet Li', power: 8000 }, 
        ], 
    

    index、entry 和 key 是模板中使用的变量。它们必须在数据部分中定义,否则您会收到未定义的错误。

    然后我创建了 grid.component.js 文件
    parasails.registerComponent('demo-grid', { 
      //  ╔═╗╦═╗╔═╗╔═╗╔═╗ 
      //  ╠═╝╠╦╝║ ║╠═╝╚═╗ 
      //  ╩  ╩╚═╚═╝╩  ╚═╝ 
      props: [ 
        'data', 
        'columns',  
        'filterKey',  
      ], 
     
      //  ╦╔╗╔╦╔╦╗╦╔═╗╦    ╔═╗╔╦╗╔═╗╔╦╗╔═╗ 
      //  ║║║║║ ║ ║╠═╣║    ╚═╗ ║ ╠═╣ ║ ║╣ 
      //  ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝  ╚═╝ ╩ ╩ ╩ ╩ ╚═╝ 
      data: function (){ 
        var sortOrders = {} 
        this.columns.forEach(function (key) { 
          sortOrders[key] = 1 
        }) 
        return { 
          sortKey: '', 
          sortOrders: sortOrders 
        } 
      }, 
     
      //  ╦ ╦╔╦╗╔╦╗╦ 
      //  ╠═╣ ║ ║║║║ 
      //  ╩ ╩ ╩ ╩ ╩╩═╝ 
      template: '#grid-template', 
     
      //  ╦  ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦  ╔═╗ 
      //  ║  ║╠╣ ║╣ ║  ╚╦╝║  ║  ║╣ 
      //  ╩═╝╩╚  ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝ 
      beforeMount: function() { 
     
      }, 
     
      mounted: function(){ 
      }, 
      // ^Note that there is no `beforeDestroy()` lifecycle callback in this 
      // component. This is on purpose, since the timing vs. `leave()` gets tricky. 
     
      computed: { 
        filteredData: function () { 
          var sortKey = this.sortKey 
          var filterKey = this.filterKey && this.filterKey.toLowerCase() 
          var order = this.sortOrders[sortKey] || 1 
          var data = this.data 
          if (filterKey) { 
            data = data.filter(function (row) { 
              return Object.keys(row).some(function (key) { 
                return String(row[key]).toLowerCase().indexOf(filterKey) > -1 
              }) 
            }) 
          } 
          if (sortKey) { 
            data = data.slice().sort(function (a, b) { 
              a = a[sortKey] 
              b = b[sortKey] 
              return (a === b ? 0 : a > b ? 1 : -1) * order 
            }) 
          } 
          return data 
        } 
      }, 
     
      //  ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗ 
      //  ║║║║ ║ ║╣ ╠╦╝╠═╣║   ║ ║║ ║║║║╚═╗ 
      //  ╩╝╚╝ ╩ ╚═╝╩╚═╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝╚═╝ 
      methods: { 
     
        sortBy: function (key) { 
          this.sortKey = key 
          this.sortOrders[key] = this.sortOrders[key] * -1 
        } 
      } 
     
    }); 
    

    注意 props 部分的格式与原始 .Vue 文件中的不同。我也删除了过滤器部分。

    我把css放在welcome.less文件中
    body { 
      font-family: Helvetica Neue, Arial, sans-serif; 
      font-size: 14px; 
      color: #444; 
    } 
     
    table { 
      border: 2px solid #42b983; 
      border-radius: 3px; 
      background-color: #fff; 
    } 
     
    th { 
      background-color: #42b983; 
      color: rgba(255,255,255,0.66); 
      cursor: pointer; 
      -webkit-user-select: none; 
      -moz-user-select: none; 
      -ms-user-select: none; 
      user-select: none; 
    } 
     
    td { 
      background-color: #f9f9f9; 
    } 
     
    th, td { 
      min-width: 120px; 
      padding: 10px 20px; 
    } 
     
    th.active { 
      color: #fff; 
    } 
     
    th.active .arrow { 
      opacity: 1; 
    } 
     
    .arrow { 
      display: inline-block; 
      vertical-align: middle; 
      width: 0; 
      height: 0; 
      margin-left: 5px; 
      opacity: 0.66; 
    } 
     
    .arrow.asc { 
      border-left: 4px solid transparent; 
      border-right: 4px solid transparent; 
      border-bottom: 4px solid #fff; 
    } 
     
    .arrow.dsc { 
      border-left: 4px solid transparent; 
      border-right: 4px solid transparent; 
      border-top: 4px solid #fff; 
    } 
    

    我在其他几个组件方面取得了成功。有一些试验和错误,我不得不从一些组件中删除一些功能。如果您真的需要参与其中,您可以在项目中使用 parasails 源代码,深入挖掘并添加您需要的功能。然后提交更改。


    标签:VUE
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号