diff --git a/curriculum/challenges/chinese/03-front-end-libraries/bootstrap/use-comments-to-clarify-code.md b/curriculum/challenges/chinese/03-front-end-libraries/bootstrap/use-comments-to-clarify-code.md
index 87128c71fd..2d2c9994fd 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/bootstrap/use-comments-to-clarify-code.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/bootstrap/use-comments-to-clarify-code.md
@@ -11,9 +11,9 @@ forumTopicId: 18347
我们必须确保让每个人都知道,他们不应该直接修改此页面上这些代码。
-记住,你可以在 `` 为结束的地方进行评论注释(像这样,``)。
+记住,你可以在 `` 为结束的地方进行评论注释。
-请你在你的 HTML 顶部加如下一段注释: `Only change code above this line.` 。
+请你在你的 HTML 顶部加如下一段注释: `Code below this line should not be changed` 。
# --hints--
@@ -23,7 +23,7 @@ forumTopicId: 18347
assert(code.match(/^\s*.*this line))\s*.*this line.*\s*-->/gi));
@@ -41,5 +41,57 @@ assert(code.match(/-->.*\n+.+/g));
assert(code.match(//g).length);
```
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
jQuery Playground
+
+
+
#left-well
+
+
+
+
+
+
+
+
#right-well
+
+
+
+
+
+
+
+
+```
+
# --solutions--
+```html
+
+
+
jQuery Playground
+
+
+
#left-well
+
+
+
+
+
+
+
+
#right-well
+
+
+
+
+
+
+
+
+```
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-drum-machine.md b/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-drum-machine.md
index 2481b6e949..446a6df203 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-drum-machine.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-drum-machine.md
@@ -27,12 +27,16 @@ forumTopicId: 301370
**需求 7:** 当触发一个具有`.drum-pad`属性的元素时,`#display`元素内应该展示这个触发元素关联音频片段的描述字符串(每一个字符串都应该是独一无二的)。
-你可以 fork [这个 CodePen pen 项目](http://codepen.io/freeCodeCamp/pen/MJjpwO) 来构建你的项目。或者你可以在任何你喜欢的环境中使用以下 CDN 链接来运行测试:`https://gitcdn.link/repo/freeCodeCamp/testable-projects-fcc/master/build/bundle.js`。
+你可以 fork [这个 CodePen pen 项目](http://codepen.io/freeCodeCamp/pen/MJjpwO) 来构建你的项目。或者你可以在任何你喜欢的环境中使用以下 CDN 链接来运行测试:`https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js`。
一旦你完成了本项目并且该项目所有测试运行通过,请提交项目的 URL。
# --hints--
+# --seed--
# --solutions--
+```js
+// solution required
+```
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-javascript-calculator.md b/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-javascript-calculator.md
index e5ab6ebc34..1660cb7f71 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-javascript-calculator.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-javascript-calculator.md
@@ -19,7 +19,7 @@ forumTopicId: 301371
**需求 3:** 我的计算器应该包含四个可以点击的元素,文本内容对应4个主要数学运算符,且应具有如下 id 属性: `id="add"`, `id="subtract"`, `id="multiply"`, `id="divide"`。
-**需求 4:** 计算器应该包含一个可点击的\`.\`(小数点)符号,对应的`id="decimal"`。
+**需求 4:** 计算器应该包含一个可点击的 `.`(小数点)符号,对应的`id="decimal"`。
**需求 5:** 我的计算器应该包含一个具有`id="clear"`属性的可以点击的元素。
@@ -31,13 +31,13 @@ forumTopicId: 301371
**需求 9:** 我应该可以在任意顺序下对一串任意长度的数字执行加、减、乘、除操作,并且当我按下`=`时,正确答案应该显示在 id 为`display`的元素中。
-**需求 10:** 在我输入数字的同时,我的计算器应该允许一个数字以多个零开头。
+**需求 10:** 在我输入数字的同时,我的计算器应该不允许一个数字以多个零开头。
**需求 11:** 当点击小数点元素时,当前展示的数值后面应该添加一个`.`符号;数字中不允许出现两个`.`符号。
**需求 12:** 我可以对包含小数点的数字执行任何四则运算(+、-、\*、/)。
-**需求 13:** 如果连续键入了两个及以上的运算符,应该执行最后一次键入的运算符。
+**需求 13:** 如果连续键入了两个及以上的运算符,应该执行最后一次键入的运算符(负数(-)运算符除外)。例如,如果输入 `5 + * 7 = `,结果应该是 `35` (等同于 5 \* 7);如果输入 `5 * - 5 =`,结果应该是 `-25`(等同于 5 x (-5))。
**需求 14:** 如果在按下`=`符号后继续按一个运算符,则应该在上一次计算结果的基础上进行新的计算。
@@ -50,12 +50,17 @@ forumTopicId: 301371
- **立即执行逻辑:** `11.5`
- **公式/表达式逻辑:** `32.5`
-你可以 fork [这个 CodePen pen 项目](http://codepen.io/freeCodeCamp/pen/MJjpwO) 来构建你的项目。或者你可以在任何你喜欢的环境中使用以下 CDN 链接来运行测试:`https://gitcdn.link/repo/freeCodeCamp/testable-projects-fcc/master/build/bundle.js`。
+你可以 fork [这个 CodePen pen 项目](http://codepen.io/freeCodeCamp/pen/MJjpwO) 来构建你的项目。或者你可以在任何你喜欢的环境中使用以下 CDN 链接来运行测试:`https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js`。
一旦你完成了本项目并且该项目所有测试运行通过,请提交项目的 URL。
# --hints--
+# --seed--
+
# --solutions--
+```js
+// solution required
+```
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-markdown-previewer.md b/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-markdown-previewer.md
index a997375080..15d8878a40 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-markdown-previewer.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-markdown-previewer.md
@@ -19,7 +19,7 @@ forumTopicId: 301372
**需求 3:** 当我在具有`#editor`属性的元素内输入文本时,具有`#preview`属性的元素应该同步更新展示我键入的内容。
-**需求 4:** 当我在具有`#editor`属性的元素内输入 Github 风格的 Markdown 内容时,文本应该以 HTML 的形式,把我所键入的内容渲染在具有`#preview`属性的元素中(提示:你不需要自己解析 Markdown——你可以引入一个叫做 Marked 的库来完成这项工作:)。
+**需求 4:** 当我在具有`#editor`属性的元素内输入 GitHub 风格的 markdown 内容时,文本应该以 HTML 的形式,把我所键入的内容渲染在具有`#preview`属性的元素中(提示:你不需要自己解析 Markdown——你可以引入一个叫做 Marked 的库来完成这项工作:)。
**需求 5:** 当我的 Markdown 预览器首次加载时,具有`#editor`属性的元素内的默认内容应该包含以下每个种类的至少一段有效的 Markdown 代码:标题(H1 标签)、次级标题(H2 标签)、链接、行内代码、代码块、列表、引用块、图片、加粗文本。
@@ -27,12 +27,17 @@ forumTopicId: 301372
**可选需求(你无需通过这项测试):** 我的 Markdown 预览器能够解析回车符并且将他们以`br`(换行)元素的形式渲染出来。
-你可以 fork [这个 CodePen pen 项目](http://codepen.io/freeCodeCamp/pen/MJjpwO) 来构建你的项目。或者你可以在任何你喜欢的环境中使用以下 CDN 链接来运行测试:`https://gitcdn.link/repo/freeCodeCamp/testable-projects-fcc/master/build/bundle.js`。
+你可以 fork [这个 CodePen pen 项目](http://codepen.io/freeCodeCamp/pen/MJjpwO) 来构建你的项目。或者你可以在任何你喜欢的环境中使用以下 CDN 链接来运行测试:`https://cdn.freecodecamp.org/testable-projects-fcc/v1/bundle.js`。
一旦你完成了本项目并且该项目所有测试运行通过,请提交项目的 URL。
# --hints--
+# --seed--
+
# --solutions--
+```js
+// solution required
+```
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-random-quote-machine.md b/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-random-quote-machine.md
index 1112cb7249..d8950d5656 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-random-quote-machine.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/front-end-libraries-projects/build-a-random-quote-machine.md
@@ -2,6 +2,7 @@
id: bd7158d8c442eddfaeb5bd13
title: 构建一个随机引语生成器
challengeType: 3
+forumTopicId: 301374
---
# --description--
@@ -10,7 +11,7 @@ challengeType: 3
在满足以下[需求](https://en.wikipedia.org/wiki/User_story)并能通过所有测试的前提下,你可以根据自己的喜好来美化你的 app。
-你可以使用 HTML、JavaScript、CSS、Bootstrap、SASS、React、Redux、jQuery 来完成这个挑战。但鉴于这个章节的学习内容与前端框架相关,推荐使用一款前端框架(比如 React)来完成这个挑战;不推荐你使用前面没有提到的技术,否则风险自负。我们有计划新增其他前端框架课程,例如 Angular 和 Vue,不过目前还没有这些内容。我们会接受并尽力处理你在使用建议的技术栈过程中遇到的问题。编码愉快!
+你可以使用 HTML、JavaScript、CSS、Bootstrap、SASS、React、Redux、jQuery 来完成这个挑战。但鉴于这个章节的学习内容与前端框架相关,推荐使用一款前端框架(比如 React)来完成这个挑战;不推荐你使用前面没有提到的技术,否则风险自担。我们有计划新增其他前端框架课程,例如 Angular 和 Vue,不过目前还没有这些内容。我们会接受并尽力处理你在使用建议的技术栈过程中遇到的问题。编码愉快!
**需求 1:** 我应该能看到一个具有`id="quote-box"`属性的包裹元素。
@@ -20,7 +21,7 @@ challengeType: 3
**需求 4:** 在`#quote-box`元素内,我应该能看到一个具有`id="new-quote"`属性的可点击元素。
-**需求 5:** 在`#quote-box`元素内,我应该能看到一个具有`id="tweet-quote"`属性的可点击元素。
+**需求 5:** 在`#quote-box`元素内,我应该能看到一个具有`id="tweet-quote"`属性的可点击 `a` 元素。
**需求 6:** 首次加载时,我的 App 应该在具有`id="text"`属性的元素内展示一条随机引语。
@@ -38,8 +39,14 @@ challengeType: 3
一旦你完成了本项目并且该项目所有测试运行通过,请提交项目的 URL。
+**注意:** Twitter 不允许在 iframe 里加载链接。如果你的 tweet 不能加载,尝试在 `#tweet-quote` 元素上使用 `target="_blank"` 或者 `target="_top"` 属性。`target="_top"` 会替换当前 tab 页的内容,所以确保当前内容已经保存了。
# --hints--
+# --seed--
+
# --solutions--
+```js
+// solution required
+```
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/jquery/change-text-inside-an-element-using-jquery.md b/curriculum/challenges/chinese/03-front-end-libraries/jquery/change-text-inside-an-element-using-jquery.md
index 31480bdf0c..a4a3fd01ba 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/jquery/change-text-inside-an-element-using-jquery.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/jquery/change-text-inside-an-element-using-jquery.md
@@ -19,7 +19,7 @@ jQuery 有一个`.html()`函数,你能用其在标签里添加 HTML 标签和
请强调 id 为`target4`的按钮的文本。
-请查看此[链接](https://developer.mozilla.org/en/docs/Web/HTML/Element/em)来了解更多``和``的区别和用法。
+请查看此[链接](https://www.freecodecamp.org/news/html-elements-explained-what-are-html-tags/#em-elemen)来了解更多``和``的区别和用法。
注意,``标签虽然传统上用来强调文本,但此后常用作图标的标签;``标签作为强调标签现在已被广泛接受。两者都可以应对本次挑战。
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/react-and-redux/connect-redux-to-the-messages-app.md b/curriculum/challenges/chinese/03-front-end-libraries/react-and-redux/connect-redux-to-the-messages-app.md
index 190dddac7e..e8cf951e52 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/react-and-redux/connect-redux-to-the-messages-app.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/react-and-redux/connect-redux-to-the-messages-app.md
@@ -28,7 +28,7 @@ assert(
);
```
-`Presentational`组件应渲染`h2`、`input`、`button`、`ul`四个元素。
+`Presentational` 组件应该渲染到页面上。
```js
assert(
@@ -82,5 +82,218 @@ assert(
);
```
+# --seed--
+
+## --after-user-code--
+
+```jsx
+ReactDOM.render(, document.getElementById('root'))
+```
+
+## --seed-contents--
+
+```jsx
+// Redux:
+const ADD = 'ADD';
+
+const addMessage = (message) => {
+ return {
+ type: ADD,
+ message: message
+ }
+};
+
+const messageReducer = (state = [], action) => {
+ switch (action.type) {
+ case ADD:
+ return [
+ ...state,
+ action.message
+ ];
+ default:
+ return state;
+ }
+};
+
+const store = Redux.createStore(messageReducer);
+
+// React:
+class Presentational extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ input: '',
+ messages: []
+ }
+ this.handleChange = this.handleChange.bind(this);
+ this.submitMessage = this.submitMessage.bind(this);
+ }
+ handleChange(event) {
+ this.setState({
+ input: event.target.value
+ });
+ }
+ submitMessage() {
+ this.setState((state) => {
+ const currentMessage = state.input;
+ return {
+ input: '',
+ messages: state.messages.concat(currentMessage)
+ };
+ });
+ }
+ render() {
+ return (
+
+
Type in a new Message:
+
+
+
+ {this.state.messages.map( (message, idx) => {
+ return (
+ - {message}
+ )
+ })
+ }
+
+
+ );
+ }
+};
+
+// React-Redux:
+const mapStateToProps = (state) => {
+ return { messages: state }
+};
+
+const mapDispatchToProps = (dispatch) => {
+ return {
+ submitNewMessage: (newMessage) => {
+ dispatch(addMessage(newMessage))
+ }
+ }
+};
+
+const Provider = ReactRedux.Provider;
+const connect = ReactRedux.connect;
+
+// Define the Container component here:
+
+
+class AppWrapper extends React.Component {
+ constructor(props) {
+ super(props);
+ }
+ render() {
+ // Complete the return statement:
+ return (null);
+ }
+};
+```
+
# --solutions--
+```jsx
+// Redux:
+const ADD = 'ADD';
+
+const addMessage = (message) => {
+ return {
+ type: ADD,
+ message: message
+ }
+};
+
+const messageReducer = (state = [], action) => {
+ switch (action.type) {
+ case ADD:
+ return [
+ ...state,
+ action.message
+ ];
+ default:
+ return state;
+ }
+};
+
+const store = Redux.createStore(messageReducer);
+
+// React:
+class Presentational extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ input: '',
+ messages: []
+ }
+ this.handleChange = this.handleChange.bind(this);
+ this.submitMessage = this.submitMessage.bind(this);
+ }
+ handleChange(event) {
+ this.setState({
+ input: event.target.value
+ });
+ }
+ submitMessage() {
+ this.setState((state) => {
+ const currentMessage = state.input;
+ return {
+ input: '',
+ messages: state.messages.concat(currentMessage)
+ };
+ });
+ }
+ render() {
+ return (
+
+
Type in a new Message:
+
+
+
+ {this.state.messages.map( (message, idx) => {
+ return (
+ - {message}
+ )
+ })
+ }
+
+
+ );
+ }
+};
+
+// React-Redux:
+const mapStateToProps = (state) => {
+ return { messages: state }
+};
+
+const mapDispatchToProps = (dispatch) => {
+ return {
+ submitNewMessage: (newMessage) => {
+ dispatch(addMessage(newMessage))
+ }
+ }
+};
+
+const Provider = ReactRedux.Provider;
+const connect = ReactRedux.connect;
+
+const Container = connect(mapStateToProps, mapDispatchToProps)(Presentational);
+
+class AppWrapper extends React.Component {
+ constructor(props) {
+ super(props);
+ }
+ render() {
+ return (
+
+
+
+ );
+ }
+};
+```
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/react/introducing-inline-styles.md b/curriculum/challenges/chinese/03-front-end-libraries/react/introducing-inline-styles.md
index 64c3e7e0ae..55addfe30e 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/react/introducing-inline-styles.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/react/introducing-inline-styles.md
@@ -7,7 +7,7 @@ forumTopicId: 301395
# --description--
-还有其他复杂的概念可以为你的 React 代码增加强大的功能。但是,你可能会想知道更简单的问题,比如:如何对在 React 中创建的 JSX 元素进行风格化。你可能知道,由于[将 class 应用于 JSX 元素的方式](define-an-html-class-in-jsx)与 HTML 中的使用并不完全相同。
+还有其他复杂的概念可以为你的 React 代码增加强大的功能。但是,你可能会想知道更简单的问题,比如:如何对在 React 中创建的 JSX 元素进行风格化。你可能知道,由于[将 class 应用于 JSX 元素的方式](/learn/front-end-libraries/react/define-an-html-class-in-jsx)与 HTML 中的使用并不完全相同。
如果从样式表导入样式,它就没有太大的不同。使用`className`属性将 class 应用于 JSX 元素,并将样式应用于样式表中的 class。另一种选择是使用***内联***样式,这在 ReactJS 开发中非常常见。
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/react/pass-state-as-props-to-child-components.md b/curriculum/challenges/chinese/03-front-end-libraries/react/pass-state-as-props-to-child-components.md
index 16141b1ebc..ed540668eb 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/react/pass-state-as-props-to-child-components.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/react/pass-state-as-props-to-child-components.md
@@ -15,7 +15,7 @@ forumTopicId: 301403
# --instructions--
-`MyApp`组件是有状态的,它将`Navbar`组件渲染成它的为子组件。将`MyApp`组件`state`中的`name`属性向下传递给子组件,然后在`h1`标签中显示`name`,`name`是`Navbar`render 方法的一部分。
+`MyApp`组件是有状态的,它将`Navbar`组件渲染成它的为子组件。将`MyApp`组件`state`中的`name`属性向下传递给子组件,然后在`h1`标签中显示`name`,`name`是`Navbar`render 方法的一部分。`name` 应该显示在文字 `Hello, my name is:` 后面。
# --hints--
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/react/render-conditionally-from-props.md b/curriculum/challenges/chinese/03-front-end-libraries/react/render-conditionally-from-props.md
index 7224fe7bc2..020fd10656 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/react/render-conditionally-from-props.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/react/render-conditionally-from-props.md
@@ -15,9 +15,9 @@ forumTopicId: 301405
代码编辑器有两个部分为你定义的组件:一个名为`GameOfChance`的父组件和一个名为`Results`的子组件。他们被用来创建一个简单的游戏,用户按下按钮来看他们是赢还是输。
-首先,你需要一个简单的表达式,每次运行时都会随机返回一个不同的值。你可以使用`Math.random()`。每次调用此方法时,此方法返回`0`(包括)和`1`(不包括)之间的值。因此,对于50/50的几率,请在表达式中使用`Math.random() > .5`。从统计学上讲,这个表达式有 50% 的几率返回`true`,另外 50% 返回`false`。在第 30 行,用此表达式替换注释以完成变量声明。
+首先,你需要一个简单的表达式,每次运行时都会随机返回一个不同的值。你可以使用`Math.random()`。每次调用此方法时,此方法返回`0`(包括)和`1`(不包括)之间的值。因此,对于50/50的几率,请在表达式中使用`Math.random() > .5`。从统计学上讲,这个表达式有 50% 的几率返回`true`,另外 50% 返回`false`。在第 render 方法里,用此表达式替换注释以完成变量声明。
-现在你有了一个表达式,可以用来在代码中做出随机决定,接下来你需要实现以下功能:将`Results`组件渲染为`GameOfChance`的子组件,并将`expression`作为 prop 传递出去,prop 的名字是`fiftyFifty`。在`Results`组件中,编写一个三元表达式基于从`GameOfChance`传来的 prop`fiftyFifty`来渲染文本`"You win!"`或者`"You lose!"`。最后,确保`handleClick()`方法正确计算每个回合,以便用户知道他们玩过多少次。这也可以让用户知道组件实际上已经更新,以防他们连续赢两次或输两次时自己不知道。
+现在你有了一个表达式,可以用来在代码中做出随机决定,接下来你需要实现以下功能:将`Results`组件渲染为`GameOfChance`的子组件,并将`expression`作为 prop 传递出去,prop 的名字是`fiftyFifty`。在`Results`组件中,编写一个三元表达式基于从`GameOfChance`传来的 prop`fiftyFifty`来渲染文本`"You Win!"`或者`"You Lose!"`。最后,确保`handleClick()`方法正确计算每个回合,以便用户知道他们玩过多少次。这也可以让用户知道组件实际上已经更新,以防他们连续赢两次或输两次时自己不知道。
# --hints--
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/react/use-proptypes-to-define-the-props-you-expect.md b/curriculum/challenges/chinese/03-front-end-libraries/react/use-proptypes-to-define-the-props-you-expect.md
index b885aed89b..dcc803fc41 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/react/use-proptypes-to-define-the-props-you-expect.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/react/use-proptypes-to-define-the-props-you-expect.md
@@ -51,7 +51,7 @@ assert(
(getUserInput) =>
assert(
(function () {
- const noWhiteSpace = getUserInput('index').replace(/ /g, '');
+ const noWhiteSpace = __helpers.removeWhiteSpace(getUserInput('index'));
return (
noWhiteSpace.includes('quantity:PropTypes.number.isRequired') &&
noWhiteSpace.includes('Items.propTypes=')
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/react/use-state-to-toggle-an-element.md b/curriculum/challenges/chinese/03-front-end-libraries/react/use-state-to-toggle-an-element.md
index 562053b6f7..f87cf54b4e 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/react/use-state-to-toggle-an-element.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/react/use-state-to-toggle-an-element.md
@@ -7,9 +7,9 @@ forumTopicId: 301421
# --description--
-有时可能在更新状态的时候想知道上一个状态是什么。但是状态更新是异步的,这意味着 React 可能会把多个 `setState()` 集中在一起批量更新。所以设置 `this.state` 或者 `this.props` 后值没有立即更新。所以最好不要写如下的代码:
+有时可能在更新状态的时候想知道上一个状态是什么。但是状态更新是异步的,这意味着 React 可能会把多个 `setState()` 集中在一起批量更新。所以设置 `this.state` 或者 `this.props` 后值后可能没有立即更新。所以最好不要写如下的代码:
-```js
+```jsx
this.setState({
counter: this.state.counter + this.props.increment
});
@@ -17,7 +17,7 @@ this.setState({
正确的做法是,给 `setState` 传入一个函数,这个函数可以访问 state 和 props。给 `setState` 传入函数可以返回赋值后的 state 和 props。代码可以重写为这样:
-```js
+```jsx
this.setState((state, props) => ({
counter: state.counter + props.increment
}));
@@ -25,7 +25,7 @@ this.setState((state, props) => ({
如果只需要 `state`,那么用下面的格式也是可以的:
-```js
+```jsx
this.setState(state => ({
counter: state.counter + 1
}));
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/react/use-the-lifecycle-method-componentdidmount.md b/curriculum/challenges/chinese/03-front-end-libraries/react/use-the-lifecycle-method-componentdidmount.md
index ed0488e18f..e17d3d82b9 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/react/use-the-lifecycle-method-componentdidmount.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/react/use-the-lifecycle-method-componentdidmount.md
@@ -13,7 +13,7 @@ React 的最佳实践是在生命周期方法`componentDidMount()`中对服务
# --instructions--
-`componentDidMount()`中有一个模拟 API 调用。它在 2.5 秒后设置 state,以模拟调用服务器检索数据。本示例请求站点的当前活动用户总数。在 render 方法中,把`activeUsers`渲染到`h1`标签中。观看预览中发生的事情,随意更改超时时间以查看不同的效果。
+`componentDidMount()` 中有一个模拟 API 调用。它在 2.5 秒后设置 state,以模拟调用服务器检索数据。本示例请求站点的当前活动用户总数。在 render 方法中,把 `activeUsers` 渲染到文字 `Active Users:` 后的 `h1` 标签中。观看预览中发生的事情,随意更改超时时间以查看不同的效果。
# --hints--
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/react/write-a-react-component-from-scratch.md b/curriculum/challenges/chinese/03-front-end-libraries/react/write-a-react-component-from-scratch.md
index 040ec87267..baffa7c3f1 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/react/write-a-react-component-from-scratch.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/react/write-a-react-component-from-scratch.md
@@ -45,5 +45,13 @@ assert(
assert(document.getElementById('challenge-node').childNodes.length === 1);
```
+`MyComponent` 应该有一个构造器,里面调用了传参 `props` 的 `super` 函数。
+
+```js
+assert(
+ MyComponent.toString().includes('MyComponent(props)') &&
+ MyComponent.toString().includes('_super.call(this, props)')
+);
+```
# --solutions--
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/sass/create-reusable-css-with-mixins.md b/curriculum/challenges/chinese/03-front-end-libraries/sass/create-reusable-css-with-mixins.md
index 49ab5eb007..4ac514a1a3 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/sass/create-reusable-css-with-mixins.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/sass/create-reusable-css-with-mixins.md
@@ -31,7 +31,7 @@ div {
}
```
-定义以`@mixin`开头,后跟自定义名称。参数(`$x`,`$y`,`$blur`,以及上例中的`$c`是可选的。 现在,只要在需要的地方使用`@include`调用上面定义的`mixin`,就可以自动添加好所有的浏览器前缀:`mixin`使用`@include`指令调用:
+定义以`@mixin`开头,后跟自定义名称。参数(`$x`,`$y`,`$blur`,以及上例中的`$c`是可选的。 现在,只要在需要 `box-shadow` 的地方使用`@include`调用上面定义的`mixin`,就可以自动添加好所有的浏览器前缀:`mixin`使用`@include`指令调用:
```scss
div {
@@ -54,32 +54,78 @@ assert(code.match(/@mixin\s+?border-radius\s*?\(\s*?\$radius\s*?\)\s*?{/gi));
你应该给`$radius`添加`-webkit-border-radius`浏览器前缀。
```js
-assert(code.match(/-webkit-border-radius:\s*?\$radius;/gi));
+assert(
+ __helpers.removeWhiteSpace(code).match(/-webkit-border-radius:\$radius;/gi)
+);
```
你应该给`$radius`添加`-moz-border-radius`浏览器前缀。
```js
-assert(code.match(/-moz-border-radius:\s*?\$radius;/gi));
+assert(
+ __helpers.removeWhiteSpace(code).match(/-moz-border-radius:\$radius;/gi)
+);
```
你应该给`$radius`添加`-ms-border-radius`浏览器前缀。
```js
-assert(code.match(/-ms-border-radius:\s*?\$radius;/gi));
+assert(__helpers.removeWhiteSpace(code).match(/-ms-border-radius:\$radius;/gi));
```
你应该给`$radius`添加`border-radius`。
```js
-assert(code.match(/border-radius:\s*?\$radius;/gi).length == 4);
+assert(
+ __helpers.removeWhiteSpace(code).match(/border-radius:\$radius;/gi).length ==
+ 4
+);
```
你应使用`@include`关键字调用`border-radius mixin`,并将其设置为 15px。
```js
-assert(code.match(/@include\s+?border-radius\(\s*?15px\s*?\);/gi));
+assert(code.match(/@include\s+?border-radius\(\s*?15px\s*?\)\s*;/gi));
+```
+
+# --seed--
+
+## --seed-contents--
+
+```html
+
+
+
```
# --solutions--
+```html
+
+
+
+```
diff --git a/curriculum/challenges/chinese/03-front-end-libraries/sass/use-for-to-create-a-sass-loop.md b/curriculum/challenges/chinese/03-front-end-libraries/sass/use-for-to-create-a-sass-loop.md
index 26425723da..c347e8587a 100644
--- a/curriculum/challenges/chinese/03-front-end-libraries/sass/use-for-to-create-a-sass-loop.md
+++ b/curriculum/challenges/chinese/03-front-end-libraries/sass/use-for-to-create-a-sass-loop.md
@@ -9,7 +9,7 @@ forumTopicId: 301462
你可以在 Sass 中使用`@for`循环,它的表现类似与 JavaScript 中的`for`循环。
-`@for`以两种方式使用:"start through end" 或 "start to end"。主要区别在于“开始结束”*排除* 结束号码,而“开始结束”*包括* 结束号码。
+`@for`以两种方式使用:"开始 through 到" 或 "开始 to 结束"。主要区别在于“开始结束”*排除* 结束号码,而“开始结束”*包括* 结束号码。
这是一个开始 **到** 结束示例:
@@ -84,4 +84,3 @@ assert($('.text-5').css('font-size') == '75px');
```
# --solutions--
-