如何制作 Netlify CMS 的列表小部件 returns 数量
How to make Netlify CMS' list widget returns number
我想为我的 Jekyll 网站使用 Netlify CMS,我有这样的布局:
{% for skills in page.skills %}
<div class="guide-skill">
<div class="guide-skill-fill">
{% for i in (1..15) %}
<div class="{% if skills.levels contains i %}fill{% endif %} skill-check"><p>{{ i }}</p></div>
{% endfor %}
</div>
</div>
{% endfor %}
以及我在使用此布局的文本编辑器中编写的页面首页:
skills:
- levels:
- 1
代码运行良好,fill
class 已正确添加。
但是当我将 Netlify CMS 与列表小部件一起使用时,它 returns 字符串而不是 levels
列表中的数字,如下所示:
skills:
- levels:
- '1'
所以代码不起作用,如何使它成为 returns 数字?
我试过的
- 引用
i
,但它给了我一个错误
- 使用
valueType : "int"
,没用
我的配置
- label: "Hero Skills"
name: "skills"
widget: "list"
required: false
fields:
- {label: "Skill Number", name: "number", widget: "number"}
- {label: "Levels", name: "levels", widget: "list"}
你不能像这样使用数学过滤器强制将此字符串转换为数字吗?
{{ yourstring | divided_by:1 }}
来源:https://help.shopify.com/themes/liquid/filters/math-filters#divided_by
更新
由于之前的方案不太好实现,所以我换了一个角度来解决问题。以下代码不假定级别为数字:
{% for skills in page.skills %}
<div class="guide-skill">
<div class="guide-skill-fill">
{% assign all_levels = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15" | split: ',' %}
{% for level in all_levels %}
<div class="{% if skills.levels contains level %}fill{% endif %} skill-check"><p>{{ level }}</p></div>
{% endfor %}
</div>
</div>
{% endfor %}
使用 NetlifyCMS 'Number' widget 允许将数字写入字符串或数字值。
如果您的前言获取字符串值,您应该使用 valueType
:
- label: "Hero Skills"
name: "skills"
widget: "list"
required: false
fields:
- {label: "Skill Number", name: "number", widget: "number", valueType: "int", default: 1}
- {label: "Levels", name: "levels", widget: "list"}
None 的内置小部件可以输出数字列表(不是字符串),但是当内置小部件不起作用时,您始终可以使用自定义小部件。自定义小部件是 React 组件,我们为那些不使用模块系统的人发布了全局挂钩(createClass
、h
)。更多文档:https://www.netlifycms.org/docs/custom-widgets/#registerwidget
对于您的特定情况,您可以修改文档示例中的类别小部件,使其仅处理数字并输出它们。在 Netlify CMS 的 index.html
文件的 body 标签末尾添加:
<script>
var NumberListControl = createClass({
handleChange: function(e) {
var value = e.target.value.replace(/[^0-9, ]/, '');
this.props.onChange(value.split(',').map(function(val) {
var trimmed = val.trim();
return trimmed ? parseInt(trimmed, 10) : trimmed;
}));
},
render: function() {
var value = this.props.value;
return h('input', {
type: 'text',
value: value ? value.join(', ') : '',
onChange: this.handleChange,
className: this.props.classNameWrapper,
});
}
});
var NumberListPreview = createClass({
render: function() {
return h('ul', {},
this.props.value.map(function(val, index) {
return h('li', {key: index}, val);
})
);
}
});
CMS.registerWidget('number_list', NumberListControl, NumberListPreview);
</script>
我想为我的 Jekyll 网站使用 Netlify CMS,我有这样的布局:
{% for skills in page.skills %}
<div class="guide-skill">
<div class="guide-skill-fill">
{% for i in (1..15) %}
<div class="{% if skills.levels contains i %}fill{% endif %} skill-check"><p>{{ i }}</p></div>
{% endfor %}
</div>
</div>
{% endfor %}
以及我在使用此布局的文本编辑器中编写的页面首页:
skills:
- levels:
- 1
代码运行良好,fill
class 已正确添加。
但是当我将 Netlify CMS 与列表小部件一起使用时,它 returns 字符串而不是 levels
列表中的数字,如下所示:
skills:
- levels:
- '1'
所以代码不起作用,如何使它成为 returns 数字?
我试过的
- 引用
i
,但它给了我一个错误 - 使用
valueType : "int"
,没用
我的配置
- label: "Hero Skills"
name: "skills"
widget: "list"
required: false
fields:
- {label: "Skill Number", name: "number", widget: "number"}
- {label: "Levels", name: "levels", widget: "list"}
你不能像这样使用数学过滤器强制将此字符串转换为数字吗?
{{ yourstring | divided_by:1 }}
来源:https://help.shopify.com/themes/liquid/filters/math-filters#divided_by
更新
由于之前的方案不太好实现,所以我换了一个角度来解决问题。以下代码不假定级别为数字:
{% for skills in page.skills %}
<div class="guide-skill">
<div class="guide-skill-fill">
{% assign all_levels = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15" | split: ',' %}
{% for level in all_levels %}
<div class="{% if skills.levels contains level %}fill{% endif %} skill-check"><p>{{ level }}</p></div>
{% endfor %}
</div>
</div>
{% endfor %}
使用 NetlifyCMS 'Number' widget 允许将数字写入字符串或数字值。
如果您的前言获取字符串值,您应该使用 valueType
:
- label: "Hero Skills"
name: "skills"
widget: "list"
required: false
fields:
- {label: "Skill Number", name: "number", widget: "number", valueType: "int", default: 1}
- {label: "Levels", name: "levels", widget: "list"}
None 的内置小部件可以输出数字列表(不是字符串),但是当内置小部件不起作用时,您始终可以使用自定义小部件。自定义小部件是 React 组件,我们为那些不使用模块系统的人发布了全局挂钩(createClass
、h
)。更多文档:https://www.netlifycms.org/docs/custom-widgets/#registerwidget
对于您的特定情况,您可以修改文档示例中的类别小部件,使其仅处理数字并输出它们。在 Netlify CMS 的 index.html
文件的 body 标签末尾添加:
<script>
var NumberListControl = createClass({
handleChange: function(e) {
var value = e.target.value.replace(/[^0-9, ]/, '');
this.props.onChange(value.split(',').map(function(val) {
var trimmed = val.trim();
return trimmed ? parseInt(trimmed, 10) : trimmed;
}));
},
render: function() {
var value = this.props.value;
return h('input', {
type: 'text',
value: value ? value.join(', ') : '',
onChange: this.handleChange,
className: this.props.classNameWrapper,
});
}
});
var NumberListPreview = createClass({
render: function() {
return h('ul', {},
this.props.value.map(function(val, index) {
return h('li', {key: index}, val);
})
);
}
});
CMS.registerWidget('number_list', NumberListControl, NumberListPreview);
</script>