اذهب إلى المحتوى

لوحة المتصدرين

  1. سارة طه

    سارة طه

    الأعضاء


    • نقاط

      1

    • المساهمات

      18


  2. عمرو محمود4

    عمرو محمود4

    الأعضاء


    • نقاط

      1

    • المساهمات

      17


  3. جمهورية ستاردول

    • نقاط

      1

    • المساهمات

      73


  4. فاطمة أحمد6

    فاطمة أحمد6

    الأعضاء


    • نقاط

      1

    • المساهمات

      52


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 07/01/15 في كل الموقع

  1. يعتبر React.js -على حداثته- من أقوى أطر عمل Javascript (بعضهم قد يسميه مكتبة وليس إطار عمل) لبناء الواجهات الرسومية على الويب، حيث طبّق أفكارًا جديدة في هذا المجال، جعلت شِفرة الواجهات البرمجية أكثر نظافة، سرعة وأكثر قابلية للصيانة. يسمح لك React ببناء الواجهة الرسومية في مجموعة مكونات، كل مكوّن عبارة عن سرد لهيكلة ومنطق المكون، إذا تمزج بين شِفرة HTML مخصصّة وشِفرة جافاسكربت تصف سلوك ذاك المكون، ليكون قائما بذاته وقابلا لإعادة الاستعمال. إطار عمل React مُطور من طرف شركة فيس بوك (Facebook)، وقد يكفيك ثقة ويجذب انتباهك بمجرد أن تعرف أن فيس بوك نفسها تستخدم React في واجهتها البرمجية على موقع Facebook نفسه! يمكنك فتح موقع Facebook وعرض شفرة HTML الخاصة به والبحث عن كلمة react للتأكد بنفسك. سنقوم في هذا الدرس بإنشاء مُربَّع تعليقات بسيط وفعَّال بإمكانك وضعه في مدوَّنتك، سيكون المُربَّع عبارة عن نُسخة مُجرَّدة من التعليقات الآنية التي تُقدمها لك تعليقات Disquse ،LiveFyre أو فيس بوك. ستجد في نهاية الدَّرس أنَّ لديكَ مُربَّع تعليقات يوفِّر ما يلي: عرض لجميع التعليقات.نموذج لإرسال تعليق.خُطَّافات لتوفير مُنتهى خلفي مُخصَّص custom backend.سوف يحتوي مُربَّع التعليقات كذلك على بعض المزايا اللَّطيفة: تعليق مُحسَّن: تظهر التَّعليقات في القائمة قبل أن يتمّ حفظها على الخادم وبناءً عليه تظهر التَّعليقات في التوِّ واللَّحظة.تحديثات حيَّة: تظهر تعليقات المستخدمين الآخرين في عرض التَّعليقات في نفس وقت الإرسال.هيئة Markdown: يُمكن للمستخدمين استخدام Markdown لتهيئة نصوصهم.هل ترغب في تخطِّي كل هذا ومعاينة المصدر؟ كل شيء موجود على GitHub. تشغيل الخادمرغم أنَّه ليس من الضروري أن تبدأ بهذا الجزء من الدرس إلَّا أنَّنا سنقوم في وقت لاحق بإضافة وظائف تتطلَّب المُشاركة POST إلى خادم قيد التشغيل. إذا كُنتَ واثقٌ من أنّك على دراية بهذا الأمر وترغب في إنشاء خادمك الخاص يُمكنكَ القيام بذلك. ولِمَن يُريد التَّركيز على تعلُّم React دون الحاجة إلى القلق بشأن جوانب الخادم، فلقد كتبنا خوادم بسيطة بعددٍ من اللُّغات: Python ،Ruby ،Go، Node.js و PHP. كلُّ هذا مُتاح على GitHub. يُمكن الاطِّلاع على المصدر أو تحميل ملفّ مضغوط للبدء. للبدء بتطبيق هذا الدَّرس، كلّ ما عليكَ فعله هو بداية تحرير public/index.php. البدءسنستخدم لهذا الدرس ملفَّات JavaScript سبق إنشاؤها على شبكة توصيل مُحتوى CDN. قم بفتح المُحرِّر المفضَّل لديك وقم بإنشاء مُستند HTML جديد: <!-- index.html --> <!DOCTYPE html> <html> <head> <title>Hello React</title> <script src="https://fb.me/react-0.13.3.js"></script> <script src="https://fb.me/JSXTransformer-0.13.3.js"></script> <script src="https://code.jquery.com/jquery-2.1.3.min.js"></script> </head> <body> <div id="content"></div> <script type="text/jsx"> // Your code here </script> </body> </html>سيتمّ كتابة شفرات JavaScript في وسم السكربت هذا طوال الفترة المتبقية من الدرس. مُلاحظة: قُمنا بإدراج jQuery هُنا لأننا نٌريد تبسيط الشَّفرات لاستدعاءات Ajax في المُستقبل، ولكنَّها ليست إلزاميَّة لعمل React. مُكوِّنكَ الأوَّلتتمحور الفكرة الأساسيَّة لـ React حول كل شيءٍ له علاقة بالمُكوِّنات التركيبيَّة القابلة للتَّشكيل modular, composable components. سنستخدم بنية المُكوٍّنات التالية لمثال مُربَّع التَّعليقات لهذا الدرس: - CommentBox - CommentList - Comment - CommentFormسنقوم الآن ببناء المُكوِّن CommentBox وما هو إلَّا وسم بسيط: // tutorial1.js var CommentBox = React.createClass({ render: function() { return ( <div className="commentBox"> Hello, world! I am a CommentBox. </div> ); } }); React.render( <CommentBox />, document.getElementById('content') );لاحظ أن أسماء عناصر HTML تبدأ بحرف صغير في حين أن أسماء فئات React تبدأ بحرف كبير. 1. صياغة JSXستُلاحظ أوَّل ما تلاحظ تلكَ الصياغة المُشابهة لـ XML في شفرة JavaScript. لدينا precompiler بسيط يُترجم الجُملة البسيطة Syntactic Sugar إلى شفرات JavaScript المُجرَّدة هذه: // tutorial1-raw.js var CommentBox = React.createClass({displayName: 'CommentBox', render: function() { return ( React.createElement('div', {className: "commentBox"}, "Hello, world! I am a CommentBox." ) ); } }); React.render( React.createElement(CommentBox, null), document.getElementById('content') );إنَّ استخدام صياغة JSX اختياري ولكن وجدنا أنَّها أسهل استخدامًا من شفرات JavaScript مُجرَّدة. يُمكن قراءة المزيد في مقال صياغة JSX 2. ماذا يحدث هنانقوم بتمرير بعض الوظائف في كائن JavaScript إلى دالَّة ()React.createClass لإنشاء مُكوِّن React جديد. أهم هذه الوظائف ما تُسمَّى تصيير render والتي تُعيد شجرة من مُكوِّنات React والتي في نهاية المطاف ستقوم بالتصيير عبر HTML. لا تُعتبر وسوم عُقَد نموذج كائن مُستند DOM فعليَّة، وإنَّما هي تمثيلات من مُكوِّنات div الخاصَّة بـ React. يُمكنكَ اعتبارها كوسوم أو قطع من البيانات والتي يعرف React كيفيَّة التعامل معها. React آمن. لا نقوم بتوليد سلاسل HTML لذلك فإن حماية XSS تُعتبر الافتراضيَّة. لا يجب عليكَ إعادة شفرات HTML قياسيَّة. وإنَّما يُمكنكَ إعادة شجرة من المُكوِّنات التي قُمتَ (أو شخص آخر قام) ببنائها. هذا ما يجعل React قابلة للتَّشكيل composable: وهي عقيدة أساسيَّة في الواجهات الأماميَّة القابلة للصّيانة. يقوم ()React.render بتمثيل المُكوِّن القاعدي، بدء عمل الإطار، ثم إدخال الوسوم إلى عنصر نموذج كائن مُستند خام، يتمّ تقديم تلك الوسوم كمُعطى ثاني . تركيب المُكوِّناتسنُنشيء الآن هياكل بناء لكلٍّ من المُكوِّنين CommentList وCommentForm والتي ستكون -مرَّة أخرى- عبارة عن وسوم بسيطة. أضِف هذين المُكوِّنين إلى ملفِّك مع الحفاظ على تعريف commentBox الحالي واستدعاء React.render: // tutorial2.js var CommentList = React.createClass({ render: function() { return ( <div className="commentList"> Hello, world! I am a CommentList. </div> ); } }); var CommentForm = React.createClass({ render: function() { return ( <div className="commentForm"> Hello, world! I am a CommentForm. </div> ); } });ما سنقوم بعمله الآن هو تحديث مُكوِّن CommentBox لاستخدام المُكوِّنات الجديدة: // tutorial3.js var CommentBox = React.createClass({ render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList /> <CommentForm /> </div> ); } });لاحظ كيف تمَّ مزج وسوم HTML والمُكوِّنات التي قُمنا ببنائها. إنَّ مُكوِّنات HTML ما هي إلَّا مُكوِّنات React مُنتظمة، تمامًا مثل تلك التي تقوم بتعريفها ولكن مع فارق واحد. سيقوم مترجم JSX تلقائيًا بإعادة كتابة وسوم HTML إلى تعبيرات React.createElement() tagName وترك كل شيء على حدة. وهذا لمنع حدوث التَّلوّث في مساحة الاسم العموميَّة global namespace. استخدام الخصائصسنقوم الآن بانشاء مُكوِّن Comment، والذي سوف يعتمد على البيانات التي تمَّ تمريرها إليه من المُكوِّن الأساسي. يتمّ اتاحة البيانات التي تمّ تمريرها من مُكوِّن أساسي كـ "خاصيَّة" في المُكوِّن الفرعي. ويتمّ الوصول إلى هذه "الخصائص" من خلال this.props. يُمكننا باستخدام الخصائص props قراءة البيانات التي تمّ تمريرها إلى Comment من CommentList، وتصيير بعض الترميزات: // tutorial4.js var Comment = React.createClass({ render: function() { return ( <div className="comment"> <h2 className="commentAuthor"> {this.props.author} </h2> {this.props.children} </div> ); } });يُمكنكَ وضع نصّ أو مُكوِّنات React في الشَّجرة وذلك بإحاطة تعبير JavaScript بأقواس داخل JSX (إما كخاصيَّة أو كمُكوِّن فرعي). نقوم بالوصول إلى خاصيَّات مُسمَّاه تمّ تمريرها إلى عنصر كمفاتيح على this.props وأيّ عناصر مُتداخلة كما this.props.children. خصائص المُكوِّننحتاج الآن وبعد أن قمنا بتحديد مُكوِّن Comment إلى تمرير اسم الكاتب ونصّ التعليق إلى هذا المُكوِّن. يسمح لنا هذا بإعادة استخدام نفس الشَّفرة لكلِّ تعليق مُختلف. لنقوم الآن بإضافة بعض التَّعليقات داخل مُكوِّن CommentList: // tutorial5.js var CommentList = React.createClass({ render: function() { return ( <div className="commentList"> <Comment author="Pete Hunt">This is one comment</Comment> <Comment author="Jordan Walke">This is *another* comment</Comment> </div> ); } });لاحظ أنَّنا قد قُمنا بتمرير بعض البيانات من مُكوِّن CommentList الأساسي إلى مُكوِّنات Comment الفرعيَّة. مرَّرنا على سبيل المثال Pete Hunt (عن طريق خاصيَّة) وThis is one comment (عن طريق عُقدة فرعيَّة تُشبه XML) إلى Comment الأوَّل. وكما ذكرنا بالأعلى فإنَّ مُكوِّن Comment سيعمل على الوصول إلى هذه الخصائص من خلال this.props.author، وthis.props.children. إضافة MarkdownMarkdown هي طريقة بسيطة لتهيئة مُضمّنة inline لنصِّك. على سبيل المثال، احاطة النص بعلامة النجمة (*) سيقوم بتأكيده. أولًا، أضِف مكتبة الطرف الثالث marked إلى تطبيقك. Marked هي مكتبة JavaScript تقوم بأخذ نص Markdown وتُحوِّله إلى صيغة HTML خام. هذا الأمر يتطلَّب وسم سكربت في قسم head (قُمنا بادراجه بالفعل في أرضيَّة React): <!-- index.html --> <head> <title>Hello React</title> <script src="https://fb.me/react-0.13.3.js"></script> <script src="https://fb.me/JSXTransformer-0.13.3.js"></script> <script src="https://code.jquery.com/jquery-2.1.3.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/0.3.2/marked.min.js"></script> </head>سنقوم بعد ذلك بتحويل نصّ التَّعليق إلى Markdown ومن ثمَّ إخراجه: // tutorial6.js var Comment = React.createClass({ render: function() { return ( <div className="comment"> <h2 className="commentAuthor"> {this.props.author} </h2> {marked(this.props.children.toString())} </div> ); } });كل ما فعلناه هنا هو استدعاء مكتبة marked. نحتاج إلى تحويل this.props.children من نصّ React مُحاط إلى سلسلة خام يُمكن لمكتبة marked فهمها ولذلك فإننا نقوم بستدعاء دالَّة ()toString. لكن لدينا مشكلة وهي أنَّه يتمّ إظهار وسوم HTML الموجودة في التَّعليقات بالشكل التَّالي في المُتصفح: This is another comment. هذا الأمر هو حماية React لك من هجوم XSS. هُناك طريقة للالتفاف على ذلك، ولكنَّ إطار العمل يُحذِّرُكَ من استخدامها: // tutorial7.js var Comment = React.createClass({ render: function() { var rawMarkup = marked(this.props.children.toString(), {sanitize: true}); return ( <div className="comment"> <h2 className="commentAuthor"> {this.props.author} </h2> <span dangerouslySetInnerHTML={{__html: rawMarkup}} /> </div> ); } });هذه الشَّفرات هي API خاصّ والذي عمدًا يجعل من الصَّعب إدراج شفرات HTML خام، في حالتنا بالنِّسبة لمكتبة marked فإنَّنا سنقوم بالاستفادة من هذا المنفذ الخلفيّ. تذكَّر: باستخدامك لهذه الميزة فإنَّك تعتمد على مكتبة marked أن تكون آمنة. نقوم في هذه الحالة بتمرير sanitize: true التي تطلب من مكتبة marked تنفيذ أي وسم HTML في المصدر بدلًا من تمريره دون تغيير. إضافة نموذج البياناتحتَّى الآن فإنَّنا نقوم بإدراج تعليقات مُباشرة في شفرات المصدر. بدلًا من ذلك، سنقوم بتصيير بضع من بيانات JSON في قائمة التعليق. يأتي هذا من الخادم في نهاية المطاف، ولكن في الوقت الراهن سنكتبها نحن في المصدر: // tutorial8.js var data = [ {author: "Pete Hunt", text: "This is one comment"}, {author: "Jordan Walke", text: "This is *another* comment"} ];الآن نحنُ بحاجة إلى إدخال هذه البيانات في مُكوِّن CommentList بطريقة نموذجيِّة. قُم بتعديل CommentBox واستدعاء ()React.render لتمرير هذه البيانات إلى CommentList عن طريق الخصائص props: // tutorial9.js var CommentBox = React.createClass({ render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.props.data} /> <CommentForm /> </div> ); } }); React.render( <CommentBox data={data} />, document.getElementById('content') );الآن حيثُ أنَّ البيانات مُتاحة في CommentList، سوف نقوم بتقديم التَّعليقات بطريقة ديناميكيَّة: // tutorial10.js var CommentList = React.createClass({ render: function() { var commentNodes = this.props.data.map(function (comment) { return ( <Comment author={comment.author}> {comment.text} </Comment> ); }); return ( <div className="commentList"> {commentNodes} </div> ); } });هذا كل شيء. الاستدعاء من الخادمسنعمل الآن على استبدال البيانات الثَّابتة ببعض البيانات الديناميكيَّة من الخادم. يتمّ ذلك بإزالة خاصيَّة البيانات data prop واستبدالها بعنوان URL للجلب: // tutorial11.js React.render( <CommentBox url="comments.json" />, document.getElementById('content') );هذا المُكوِّن مُختلف عن المُكوِّنات السَّابقة حيثُ أنَّه سيضطر إلى إعادة تصيير نفسه. لن يحتوي المُكوِّن على أيّ بيانات إلى أن يعود الطَّلب من الخادم، في هذه الحالة قد يحتاج المُكوِّن إلى تصيير بعض التَّعليقات الجديدة. الحالة التفاعليَّةقام كلّ مُكوِّن حتَّى الآن على أساس خصائصه بتصيير نفسه مرة واحدة. الخصائص props ثابتة: يتمّ تمريرها من المُكوِّن الأساسي و”مملوكة” من قبل المُكوِّن الأساسي كذلك. لتنفيذ التَّفاعلات، فإنَّنا نُقدِّم حالة قابلة للتغيير إلى المُكوِّن. حالة this.state هي خاصَّة بالمُكوِّن ويُمكن تغييرها من خلال استدعاء ()this.setState يقوم المُكوِّن بإعادة تقديم نفسه عند تحديث الحالة. وظائف ()render مكتوبة إلزاميًّا كدوال this.props وthis.state. يضمن إطار العمل أن تكون واجهة المستخدم دائمًا مُتَّسِقَة مع المُدخَلات. عندما يقوم الخادم بجلب بيانات سنقوم نحن بتغيير بيانات التعليق لدينا. لنُضيف الآن مصفوفة من بيانات التَّعليق كحالة للمُكوِّن CommentBox: // tutorial12.js var CommentBox = React.createClass({ getInitialState: function() { return {data: []}; }, render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm /> </div> ); } });يتمّ تنفيذ دالَّة ()getInitialState مرَّة واحدة فقط خلال دورة حياة المُكوِّن كما أنَّها تبدأ الحالة الأوليَّة للمُكوِّن. تحديث الحالةنُريد عند إنشاء المُكوِّن لأوَّل مرَّة أن نحصل على (GET) بعض بيانات JSON من الخادم وتحديث الحالة لتعكس أحدث البيانات. هذا من شأنه أن يكون نقطة نهاية ديناميكيَّة لو كان الأمر في تطبيق حقيقي، ولكن سنستخدم لهذا المثال ملف JSON ثابت لابقاء الأمور بسيطة: // tutorial13.json [ {"author": "Pete Hunt", "text": "This is one comment"}, {"author": "Jordan Walke", "text": "This is *another* comment"} ]سنقوم باستخدام مكتبة jQuery للمساعدة في عمل طلب غير متزامن asynchronous request إلى الخادم. مُلاحظة: حيثُ أنَّ هذا الأمر أصبح تطبيق AJAX فإنَّك سوف تحتاج لتطوير تطيبقك باستخدام خادم ويب بدلًا من أن ملف موجود في نظام ملفاتك. قدَّمنا -كما هو مذكورٌ بالأعلى- العديد من الخوادم التي يُمكنكَ استخدامها على GitHub. توفر تلك الخوادم التأدية الوظيفيَّة التي تحتاجها لبقيَّة هذا الدرس. // tutorial13.js var CommentBox = React.createClass({ getInitialState: function() { return {data: []}; }, componentDidMount: function() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm /> </div> ); } });وظيفة componentDidMount هنا هي وظيفة تُستدعى تلقائيًا بواسطة React عندما يتمّ تصيير مُكوِّن. مفتاح التَّحديثات الديناميكيَّة هو استدعاء دالَّة ()this.setState. نقوم باستبدال مصفوفة التَّعليقات القديمة بواحدة جديدة من الخادم وتقوم واجهة المستخدم بتحديث نفسها تلقائيًا. بسبب هذا التفاعل، يُعتبر التغيير لإضافة تحديثات حيَّة طفيفًا. سوف نستخدم أسلوب بسيط في هذا الدَّرس ولكن لكَ الحُريَّة في استخدام WebSockets أو غيرها من التكنولوجيَّات. // tutorial14.js var CommentBox = React.createClass({ loadCommentsFromServer: function() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, getInitialState: function() { return {data: []}; }, componentDidMount: function() { this.loadCommentsFromServer(); setInterval(this.loadCommentsFromServer, this.props.pollInterval); }, render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm /> </div> ); } }); React.render( <CommentBox url="comments.json" pollInterval={2000} />, document.getElementById('content') );كل ما فعلناه هنا هو نقل استدعاء AJAX إلى وظيفة مُستقلَّة واستدعائها عند تحميل المُكوِّن الأوَّل واستدعائها كلّ ثانيتين بعد ذلك. حاول تشغيل هذا في مُتصفِّحك وتغيير ملف comments.json. في غضون ثانيتين ستظهر لكَ التغييرات. إضافة تعليقات جديدةحان الآن الوقت لبناء النموذج. على مُكوِّن CommentForm أن يسأل المُستخدم عن اسمه ونصّ التَّعليق، ثم يقوم بإرسال طلب إلى الخادم لحفظ التعليق. // tutorial15.js var CommentForm = React.createClass({ render: function() { return ( <form className="commentForm"> <input type="text" placeholder="Your name" /> <input type="text" placeholder="Say something..." /> <input type="submit" value="Post" /> </form> ); } });دعونا نجعل النموذج متجاوب. عندما يقوم المُستخدم بإرسال النَّموذج، يجب علينا مسحه clear، تقديم طلب إلى الخادم، ثُمَّ تحديث قائمة التعليقات. للبدء في تنفيذ هذا، سقوم بالاستماع إلى حدث ارسال النَّموذج ومسحه. // tutorial16.js var CommentForm = React.createClass({ handleSubmit: function(e) { e.preventDefault(); var author = React.findDOMNode(this.refs.author).value.trim(); var text = React.findDOMNode(this.refs.text).value.trim(); if (!text || !author) { return; } // TODO: send request to the server React.findDOMNode(this.refs.author).value = ''; React.findDOMNode(this.refs.text).value = ''; return; }, render: function() { return ( <form className="commentForm" onSubmit={this.handleSubmit}> <input type="text" placeholder="Your name" ref="author" /> <input type="text" placeholder="Say something..." ref="text" /> <input type="submit" value="Post" /> </form> ); } });1- الأحداث Eventsتقوم React بإرفاق مُعالجات الحدث في المُكوِّنات باستخدام اتفاقية التَّسمية camelCase. نقوم بإرفاق مُعالج onSubmit إلى النَّموذج الذي يعمل على مسح حقول النَّموذج عند إرساله مع إدخال صحيح. عليكَ استدعاء ()preventDefault بالحدث لمنع الإجراء الافتراضي للمُتصفِّح من اعتماد النَّموذج. 2- المراجع Refsنستخدم خاصيَّة ref لتعيين اسم للمُكوِّن الفرعي وthis.refs لارجاع المُكوِّن. يمكن أن نستدعي (React.findDOMNode(componentعلى مُكوّن للحصول على عنصر نموذج كائن مُستند المُتصفِّح الأصلي. 3- نداءات الخصائصعندما يُرسِل المُستخدم التَّعليق، فإنَّنا سوف تحتاج إلى تحديث قائمة التَّعليقات لتشمل التَّعليق الجديد. من الطبيعي أن تفعل كل هذا في مُكوِّن CommentBox حيث أنَّ المُكوِّن يمتلك الحالة التي تُمثِّل قائمة التَّعليقات. نحن بحاجة لتمرير البيانات من نُسخة المُكوِّن الفرعي الاحتياطيَّة إلى المُكوِّن. يتمّ فعل هذا في وظيفة render الخاصَّة بالأب عن طريق تمرير رد نداء جديد (handleCommentSubmit) في الابن ثُمَّ الزامها لحدث الابن onCommentSubmit. كُلَّما تم تشغيل الحدث، سيُنفَّذ الاستدعاء: // tutorial17.js var CommentBox = React.createClass({ loadCommentsFromServer: function() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, handleCommentSubmit: function(comment) { // TODO: submit to the server and refresh the list }, getInitialState: function() { return {data: []}; }, componentDidMount: function() { this.loadCommentsFromServer(); setInterval(this.loadCommentsFromServer, this.props.pollInterval); }, render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm onCommentSubmit={this.handleCommentSubmit} /> </div> ); } });سوف نستدعي الآن النِّداء من CommentForm عندما يقوم المُستخدم بإرسال النَّموذج: // tutorial18.js var CommentForm = React.createClass({ handleSubmit: function(e) { e.preventDefault(); var author = React.findDOMNode(this.refs.author).value.trim(); var text = React.findDOMNode(this.refs.text).value.trim(); if (!text || !author) { return; } this.props.onCommentSubmit({author: author, text: text}); React.findDOMNode(this.refs.author).value = ''; React.findDOMNode(this.refs.text).value = ''; return; }, render: function() { return ( <form className="commentForm" onSubmit={this.handleSubmit}> <input type="text" placeholder="Your name" ref="author" /> <input type="text" placeholder="Say something..." ref="text" /> <input type="submit" value="Post" /> </form> ); } });الآن وبعد أن أصبح النِّداء في مكانه الصحيح، كل ما علينا القيام به هو الإرسال إلى الخادم وتحديث القائمة: // tutorial19.js var CommentBox = React.createClass({ loadCommentsFromServer: function() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, handleCommentSubmit: function(comment) { $.ajax({ url: this.props.url, dataType: 'json', type: 'POST', data: comment, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, getInitialState: function() { return {data: []}; }, componentDidMount: function() { this.loadCommentsFromServer(); setInterval(this.loadCommentsFromServer, this.props.pollInterval); }, render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm onCommentSubmit={this.handleCommentSubmit} /> </div> ); } });تحديثات مُحسَّنةمشروعنا الآن كامل الوظائف ولكن من المُمل أن نقوم بانتظار الطَّلب حتَّى يكتمل قبل ظهور تعليقك في القائمة. يُمكننا إضافة هذا التَّعليق إلى القائمة لجعل التطبيق يعمل بشكلٍ أسرع. // tutorial20.js var CommentBox = React.createClass({ loadCommentsFromServer: function() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, handleCommentSubmit: function(comment) { var comments = this.state.data; var newComments = comments.concat([comment]); this.setState({data: newComments}); $.ajax({ url: this.props.url, dataType: 'json', type: 'POST', data: comment, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, getInitialState: function() { return {data: []}; }, componentDidMount: function() { this.loadCommentsFromServer(); setInterval(this.loadCommentsFromServer, this.props.pollInterval); }, render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm onCommentSubmit={this.handleCommentSubmit} /> </div> ); } });ختامًاانتهيتَ لتوك من إنشاء مربع تعليقات في بضع خطوات بسيطة. يُمكنك الآن التَّعرُّف على المزيد حول أسباب استخدام React، أو الخوض في مراجع API وبدء العمل. ترجمة -وبتصرّف- للمقال: Tutorial | React.
    1 نقطة
  2. تظهر على الدوام توجهات مُختلفة للتصميم والتي تُطلقها وتقف خلفها الشركات الكبيرة المؤثرة على الأسواق، وتُعدّ تقنيّة التصميم بالظل الطويل "Long Shadow Design" أحد أكثر التوجهات المُلفتة والتي ظهرت مع إعلان شركة Apple لنظامها iOS 7 وأصبحت تُكمّل جنباً إلى جنب تقنيّة التصاميم المُسطحة "Flat designs" والتي أظهرتها شركة مايكروسوفت Microsoft جلياً مع نظامها Windows 8. الظل الطويل "Long Shadow" ببساطة!هو عبارة عن ظل مُنحني بزاوية 45 درجة في العادة ويُمكن رسمه في الطرف اليميني أو اليساري للتصميم (عادة يُستخدم الظل على يمين التصميم للناظر – أي كأن هُناك ضوء مُسلّط من أعلى اليسار ليظهر الظل في اليمين)، وبدأ استخدام التأثير مع الايقونات "icons" إلّا أنه امتد ليشمل الكتابة والرسومات والأجهزة بحسب نظرة المُصمم وإبداعه في التطبيق. أمثلة تطبيقيّة: على اليمين Skype من تصميم JustD. على اليسار Flat Club من تصميم miguelcm. تطبيق عملي على تأثير الظل الطويل "Long Shadow":بعد أن تعرفتم على تاريخ انطلاق التأثير سنكون سعداء لأخذكم بجولة تطبيقيّة تشرح آلية تنفيذ التصميم عبر برنامج Adobe Photoshop. سنخرج بدرسنا بالنتيجة التالية: تلميح: كما هو معروف في عالم التصميم بأن النتيجة النهائية قد تظهر بعدة طرق قد يكون بعضها مُعقّد وصعب وبعضها سريع وجميعها يؤدي الغرض. أيضا نود أن نشير بأنه وبعد انتشار توجّه التصميم بالظل الطويل ظهرت العديد من المواقع الالكترونية التي وفّر بعضها تطبيقات مأجورة و مجانيّة تُمكّن المُستخدمين ممن ليست لديهم خبرة في التعامل مع برامج التصميم من تطبيق الظل الطويل على الرسومات والشعارات الخاصة بهم، أيضاً هُناك إضافات مكتبية وإضافات إلى برامج التصميم ذاتها وفّرت نفس الفكرة، إنما في العادة لا تُوجد نتائج صحيحة وواضحة بشكل كامل باستخدام تلك التطبيقات التي تعتمد على نقاط وخوارزميات مُحددة لذا فإن مُعظمها لن تُلبي الاحتياج المطلوب بشكله الكامل. سنوفّر لكم بهذا الدرس الأساس الصحيح لعمل تأثير الظل الطويل "Long Shadow" بخطوات واضحة عبر استخدام برنامج Adobe Photoshop. لنبدأ بالتطبيق! الخطوة الأولى:1 - افتح مساحة عمل جديدة في Adobe Photoshop واختر الإعدادات كما في الصورة أدناه: 2- اختر لون مُناسب للخلفية، سوف نختار اللون (714a76 #) في تصميمنا: 3- اكتب الاسم المُراد التطبيق عليه واختر له اللون الأبيض (ffffff#) ثُم قم بتوسيطه داخل مساحة الرسم، كما هو موضّح أدناه: (تلميح: تأثير الظل الطويل سوف يبرز بشكل جمالي أكبر مع الخطوط العريضة) الخطوة الثانية:1- تحديد زاوية 45 درجة (وهي زاوية ميلان الظل المُراد رسمه) من خلال اتباع ما يلي: اضغط على (CTRL + " / أو حرف ط) لإظهار الشبكةقم بتقريب الصورة من خلال استخدام أداة (Zoom Tool – أو العدسة المُكبِّرة) أو بالضغط مُباشرة على الحرف Zارسم سطر بشكل يدوي من خلال استخدام أداة (Line Tool) أو بالضغط مُباشرة على الحرف Uقُم بإدارة السطر بين زاويتيّ إحدى خانات الشبكة كي يُصبح ميلانه بزاوية 45 درجة (ما يهمُنا هُنا هو تحديد الميلان بزاوية 45 درجة وطريقتها كانت بتقسيم زوايا المُربع في المُنتصف كون أن زواياه قائمة "90 درجة"، لاحظ السطر الأخضر كيف يخترق مُربعات الشبكة بالرسم التوضيحي) 2- كرّر السطر الأخضر (مُحدِّد ميلان الظل) بنسخه وتوزيعه على الزوايا اليمينية للكلمة كما هو مُوضّح بالشكل التالي: الخطوة الثالثة:1- رسم الظل الطويل من خلال اتباع المراحل التالية: - اختر أداة البن تول (Pen Tool) وضع إعدادات الرسم كما هو مُوضّح 2- اعمل على الرسم بأداة (Pen Tool ) بالوصل بين نُقاط الزوايا العُلوية اليمينية كما هو موضّح بالصور: النتيجة: 3- كرّر نفس طريقة العمل السابقة لرسم ظل للنُقاط كما هو مُوضّح: النتيجة: الخطوة الرابعة والأخيرة:1- العمل على دمج ظل الكلمة مع ظل النُقاط من خلال اتباع ما يلي: - اذهب إلى نافذة الطبقات "Layers" وحدد طبقات الظلال من خلال إبقاء الضغط على زر CTRL واختيار الطبقات المُراد دمجها بزر الفأرة الأيسر. - بعد التحديد اضغط بزر الفأرة الأيمن واختر Merge Layers (( بالإمكان الاستعانة بالاختصار CTRL + E )) 2- العمل على تفتيح الظل لإخراجه بشكل واقعي ومُناسب: - اذهب إلى نافذة الطبقات "Layers" واضغط بزر الفأرة الأيمن على الطبقة الخاصة بالظل واختر نافذة Blending Options ثُم توجّه إلى نافذة إعدادات التدرج Gradient Overlay وحدّد ألوان التدرج للظل. لرسمتنا قُمنا بتحديد اللون الخفيف نفس لون الخلفية (714a76 #) ليظهر تلاشي للظل عند ابتعاده. كما اخترنا للظل الثقيل اللون (523a55 #). النتيجة النهائية للعمل
    1 نقطة
  3. عندما تبدأ العمل ككاتب حر، قد تشتري اسم نطاق، ترفع موقعك إلى شبكة الإنترنت وتنتظر ليتهافت عليه العملاء، ولكن الوقت يمرّ دون أن يحدث أي شيء. هذا ما حدث معي، وعليه قمت بمراجعة كل ما كتبت في الموقع وعلمت أن هناك خطأ ما، فذهبت لمواقع التواصل الاجتماعي واستفسرت عن الأمر، وكنت على أهبة الاستعداد للتغيير من أجل زيادة الإنتاج والكسب. ولكن هل تعرف ماذا حدث بعد ذلك؟ لم يحدث شيء. في نهاية المطاف، راجعت ما كنت أفعله و حاولت جاهداً لإيجاد مواضع الخطأ، وأخيراً اعترفت لنفسي، فالخطأ كان مؤلماً، إن موقعي كان شبه طارد للعملاء، وليس فيه عناصر جاذبة. إذا كنت كاتبًا مستقلًا وتحاول الحصول على عملاء، ولكن ذلك لم يحدث، فقد حان الوقت لمواجهة الحقيقة القاسية، وهي أن موقعك طارد لزواره، يحدث هذا حتى وإن كانت لديك الخبرات والمهارات الجاذبة، ولكن العملاء المحتملين ما إن يدخلوا موقعك الخاص حتى يولوا مُدبرين. مع أخذ ما سبق بعين الاعتبار، سأحاول وضع الخطوط العريضة للأسباب التي تجعل من موقعك موقعاً طارداً، ومن ثم أشرح ما يمكنك عمله لتغيير الأمور للأفضل. بدون موقع على الشبكةخطأ فادح، أتمنى أنك لم تقع فريسة له، ولكن الكثير من المستقلين ليس لديهم موقع على شبكة الإنترنت، فإذا كنت حتى الآن بدون موقع على الشبكة، فأنت تمارس العمل الحر بالطريقة الخطأ. أطلق موقعًا أو مدوّنة، ارفع إليه قالبًا جاهزًا، أو حتى استعن بمُصمّم لتصميم قالب لك، المهم يجب أن يكون له حضور على الإنترنت. ولكن ابتعد قدر المُستطاع عن المنصات التي تُقدم الاستضافة المجانية والتي توفر أدوات لبناء موقعك من دون برمجة،لأن الإعلانات التجارية التي تُظهرها هذه المواقع ستجعلك تبدو أقل مهنية، استثمر بعض المال لحجز استضافة، إذا كنت تريد أن تُظهر عملك أكثر احترافية. الفوضى البصريةوهي من أكبر المشاكل التي يعاني منها الكثير من المواقع، فقد تجعل من قراءة مُحتوى الموقع مهمّة صعبة جدًا، لوجود الكثير من النصوص المكدسة فوق بعضها البعض، وهناك الكثير من الصفحات التي لا داعي لها أيضاً، أو أن اختيارك للألوان اختيار غير موفق ومشتت لتفكير الزائر. فالعملاء المحتملين هم في عجلة من أمرهم في الغالب، فلا يحبذ معظمهم فكرة بذل مجهود كبير لقراءة كل النصوص الطويلة على موقعك، وبالتالي فالكرة في ملعبك الآن. فمن الأفضل دائماً: اعتماد البساطة في عرض المعلومات على الإنترنت.أن تكون الصفحات الرئيسية قليلة قدر الإمكان، تحمل عناوين واضحة، وسهلة التنقل فيما بينها.حاول جاهداً أن تكون الفقرات قصيرة، فكثير من الناس يقرأ بالمسح السريع للنص.ليتمكن العميل من العثور على المعلومة بسرعة، أجعل النص بلون غامق على خلفية بيضاء، وتأكد من وجود مساحات بيضاء أكثر من النص.أعمل على وضع الصور والرسوم بشكل مدروس وعند الحاجة إليها فقط وليس لملء الفراغات.صعوبة التواصل معكأحد أكبر الأخطاء التي يمكن أن ترتكبها على موقعك هو عدم توفير معلومات الاتصال بشكل مترافق مع الخدمات التي يمكن أن تقدمها، فقد تُكثر من كلمة "إذا" مثل: إذا كنت ترغب في الحصول على اتصال. إذا كان لديك مشكلة. إذا كنت تعتقد أنك بحاجة للمساعدة.وغيرها الكثير، ولكنك في المقابل لم تخبر العملاء المحتملين ما يجب عليهم القيام به بالضبط. قد تطرح عليهم الأسئلة ولكن تترك لهم مهمة البحث عن معلومات الاتصال للحصول على المزيد من المعلومات. فبدل من استعمال كلمة "إذا" وتترك للعميل يتخيل كيف يتصل، عليك أن تقول له ما يجب عليه القيام به بالضبط، على سبيل المثال: اتصل بي اليوم في الفترة بين كذا وكذا. يمكنك الاشتراك في قائمتي البريدية والحصول على التقرير الخاص بك مجاناً.وبعدها بشكل مباشر عليك إضافة معلومات الاتصال الخاصة بك. ويُفضل وجود رقم الهاتف في مقدمة معلومات الاتصال، ثم عنوانك البريدي، ولا تنتظر أن يقوم بملء نموذج الاتصال. لا بد أن تحتوي جميع الصّفحات نداء للإجراء call-to-action، بشكل يُسهّل على الزّائر للاتّصال بك بطريقة لا تتطلّب أي جهد من طرفه. الاستفاضة غير الضرورية في سرد المعلومات الشخصيةإذا انتابك شك حول أداء موقعك، وكنت تعتقد بأن هناك مُشكلَا فيه فأوّل ما يجب التّحقّق منه هو محتويات صفحة المعلومات الشخصية على الموقع، وطريقة سرد هذه المعلومات، لأن العميل المحتمل لن يطلب خدماتك بسبب قصّة حياتك ولكنه سيتعاقد معك إذا علم القيمة الحقيقية لما يمكن أن تقدمه له، وبالتالي فعندما تقوم بتجميع المحتوى لموقعك، تأكد من: التركيز على الزبائن وما يمكنك القيام به بالنسبة لهم.لا تكثر الحديث عن نفسك، اذكر القليل فقط (القدر الكافي الذي يُظهر جانبك الإنساني) حيث أن الإطناب سيُعطي الانطباع بأنك شخص مهووس بنفسه.لا تضع جميع الأعمال التي قمت بها، استعرض فقط أفضل العينات.حاول التركيز على المعلومات الأساسية ووضعها في الأعلى بشكل مرئي دون الحاجة للبحث المضني عنها.تزييف الحقائقعندما بدأت العمل كمستقل، أردت لموقعي أن يبدو أكثر مهنية وأكثر إثارة للإعجاب، لذلك كتبت بصيغة توحي بأنني جزء من فريق مؤسسة عريقة، ولم أدرك الخطأ الفادح الذي قمت به إلى أن تحدثت على الهاتف مع أحد العملاء وشرحت له أنني لا أستطيع القيام بالمهمة بالسرعة التي يطلبها لأنني وحدي، حيث أن الزبونة أرادت التعاقد معي على أساس الصيغة الملكية لكلمة "نحن" (والتي هي في حقيقة الأمر تتحدث عني وعن... قطتي) التي كانت واضحة في الموقع. لا حرج من استخدام صيغة جادة خاصّة إذا كانت هذه الصّيغة هي المُفضّلة لنوعية الزّبائن الذين تستهدفهم، لكن احذر من مغبة إظهار نفسك أكبر من حجمك الحقيقي، فقد يُعطي الأمر نتائج عكسية وستظهر بمظهر العامل الحُر الغبي. تجّنب الحديث عن نفسك بصيغة الغائب، أو أن تخلط ما بين صيغة المُتكلم والغائب معًا، تجّنب صيغة الجمع "نحن" وابتعد قدر الإمكان عن المُصطلحات الرّنانة واستبدلها بمُصطلحات أبسط. اكتب وكأنك تُخاطب عميلك مُباشرة، حدّثه مُباشرة وبكلمات بسيطة عن السّبب الذي يجعل من توظيفك هو الخيار الأنسب بالنّسبة له. لن يُساعد ذلك على جعلك موقعك يظهر بمظهر أفضل، بل سيُعطي الفرصة لزبائنك لمعرفة المزيد حولك ولزيادة فرص توظيفهم لك. حان الوقت لتصحيح الأمرإن أهم ما في الموضوع أن تدرك أن موقعك غير جاذب، وعندها فقط يمكنك العمل على تحديد مواقع الخلل فيه. ومع ذلك فمهمة إعادة صياغة كاملة للموقع ليست بالمهمة السهلة أبداً، وربما ستكون سببًا في صرفك النظر عن تغييره أو تأجيل هذه المهمة، يحدث ذلك حتى وإن كنت تعرف ما تريد فعله بالتحديد، فقد تجد نفسك تحدق في موقعك لمدى شهر وأنت على علم أنه غير جاذب، دون القيام بأي تغيير، لأنك لا تعلم من أين تبدأ. إذا أنتابك مثل هذا الشعور، فلا تحاول فعل كل شيء دفعة واحدة ولا أن تتجاهل المشكلة، ولكن أبدأ في التغييرات واحداً تلو الأخر حتى يتألق موقعك. وإليك بعض الأفكار التي قد تساعدك في ذلك: إقرأ النصوص الموجودة في موقعك بصوت عالِ، بذلك ستتمكن من معرفة الأماكن التي لا تتناسب وما ترُيد قوله وما يجب إبقاؤه وما يجب حذفه.اطلب من أحد أصدقائك الذين يعملون في مجال الكتابة والتّحرير، أن يطّلع على موقعك بهدف معرفة مدى سهولة قراءته.استخدم قالبًا جديداً يحتوي على المزيد من المساحات البيضاء، أو تواصل مع مصمم مواقع لمساعدتك في ذلك.حاول خفض ملف التعريف الخاص بك إلى فقرة أو اثنتين على الأكثر.أعد يومياً كتابة صفحة واحدة على الأقل من الصفحات القديمة على موقعك.أضف عنوان بريدك الإلكتروني إلى صفحة الاتصال الخاصة بك.اطلب من زملائك في المجال مراجعة عملك.إيجاد زبائن لك كمستقل هو في الغالب من أصعب التحديات، فلا تدع موقعك يجعلها أكثر صعوبة، خذ وقتاً كافياً للتأكد من سير موقعك، وأنه معك لا ضدك، وسيكون بذلك عما قريب أفضل مسوّق لك. هل تجد أي من هذه الأخطاء في موقعك؟ هل استخدمت أي من هذه النصائح لتجعل موقعك يزيد من تألقك؟ شاركنا أفكارك وتعليقاتك على الموضوع. ترجمة -وبتصرّف- للمقال: Why Your Freelance Website Stinks (Mine Did Too) and How to Fix It.
    1 نقطة
  4. هل سبق وأن حدث شيء ما في شركتك وكنت آخر من يعلم عنها؟ في الواقع، قمت بطرح هذا السؤال على مجموعة من أصحاب ومؤسسي الأعمال والمدراء التنفيذيين، وكان الرد دائمًا متشابه "نعم، وبلا شك لقد كنت آخر من يعلم عن أمر حدث داخل الشركة". ربما تتفاجأ حين تعلم أن بعض المُوظّفين الجُدد يُحسّون بنوع من البُعد عن بقية أعضاء الشّركة، أو حينما تعلم أن أداء أحد موظفيك تراجع بينما تعتقد أنّ الأمور جميعها تسير على ما يرام. والأسوأ أنك ستشعر بصدمة كبيرة حينما تعلم متأخّرًا أن أحد كبار الموظفين الذين اعتمدت عليهم لسنوات قد أرسل إشعارًا* باستقالته خلال أسبوعين. حسنًا، إن كنت تعلم عن بعض هذه المشاكل داخل الشركة في وقت متأخر، فهل من الممكن القيام بأي إجراءات حيال ذلك؟ في الحقيقة، إن لم تكن آخر من يعلم عن بعض الأشياء التي تدور في شركتك، فحينها فقط سيكون بإمكانك أن تتجنب أن تكبر بعض المشاكل الخفيفة لتُصبح مشاكل كبيرة، وأن تنفذ التغييرات الضرورية والهامة للشركة وأن تحافظ على بقاء الموظفين الرئيسين في الشركة لمدة أطول. فقدان النشاط، الوقت، المال والموظفين هو الثمن الحقيقي الذي ستدفعه كونك آخر من يعلم. فتشغيل شركة ما دون معرفة ما يدور فيها كما ينبغي هو أمرٌ في غاية الخطورة، فهو يشبه تمامًا أن تقود سيّارتك وأنت مُغمض العينين. لكن لماذا تكون آخر من يعلم؟ وما الذي يُمكنك القيام به اتجاه ذلك بصفتك رياديّا، مؤسّسًا أو رئيسًا تنفيذيًا؟ لماذا تكون آخر من يعلم دائمًا؟كونك "آخر من يعلم"، فهذا صفةٌ طبيعية عندما تكون أنت ربّ العمل. فعندما تكون في هذا المنصب ينشأ حاجز قوة خفية تظهر في أيّ تفاعل بينك وبين موظفيك. في هذه العلاقات يظهر الخوف دومًا، فالموظف يكون قلقًا باستمرار من معاملته بشكل مختلف إذا تحدث عن ما يجول في خاطره. فعندما يريد الموظف أن يتكلم حول شيء ما، فإنّ أول ما يدور في ذهنه هو أنك ستأخذ عنه انطباعًا سلبيًا أو ستتأخر في ترقيته، أو حتى طرده من الشركة. ولكن الخوف ليس السبب الوحيد الذي يدفع الموظفين إلى عدم مشاركة ما يدور في خلدهم مع رؤسائهم. فالسبب الأول الذي يدفع الموظفين إلى عدم التكلم في عملهم، هو شعورهم بأن كلامهم مهما كان، سيكون بلا جدوى. فهم يعتقدون بأنهم مهما تحدثوا، فلن يتغير شيء، ولن يكون لرأيهم أو فكرتهم أي تأثير على النتائج. في الحقيقة، أظهرت الدراسات أنّ هذا الشعور يكون أكثر تأثيرًا في مسألة عدم التحدث بـ 1.8 مرة من الشعور بالخوف. وهذا يعني، أنك كمدير أو مؤسس أو مدير تنفيذي، عليك أن تتغلب على مشاعر الخوف وعدم الجدوى المغروسة في موظفيك، إذا أردت ألا تكون آخر من يعلم. كيف يُمكن أن تتجنب هذه المسألة؟الآن إليك 4 استراتيجيات يُمكنك استخدامها لتعزيز التواصل بينك وبين الموظفين وإقناعهم بأنه سيتمّ التّعامل مع آراءهم واقتراحاتهم بصورة إيجابية. ابدأ بنفسكإذا أردت من الموظف أن يتشارك معك رأيه بكل مصداقية، فيجب أن تكون على استعداد تام لمشاركة رأيك معه بصدق وصراحة منذ البداية، فلا تتوقع أن يكون الموظف منفتحًا معك بينما أنك لا تبادله نفس الأمر. وحتى تكون السّباق دائمًا، ينبغي عليك أن تطلب المشورة بدلاً من انتظار ردود الأفعال أو التّغذية الرّاجعة. حينما تدير الحوار بهذه الطريقة فإنّك تُخلّص الموظفين من الضغط والتوتر الذي ينتج عن الأمر. عادة ما يميل الناس إلى تقديم المشورة أو المساعدة، أما ردود الأفعال فهي ما تكون شبيهة بتوجيه النقد. جرب أن تستخدم هذه العبارة مع موظفيك:" أرغب في معرفة رأيك حول القضية الفلانية..." الطريقة الأخرى لتكون السّباق داخل الشركة تكمن في الظّهور في مظهر من يحتاج إلى مُساعدة، وذلك عبر تشارك بعض المشاكل والعقبات التي تُواجهك، وهذا يعطي انطباعًا لدى الموظفين بأنك تريد سماع معلومات وآراء صادقة منهم بدون أي مجاملات. جرب أن تستخدم هذه العبارات مع موظفيك:" أواجه مُشكلة مع ... " أو "هل يُمكنك مساعدتي في فهم هذا الشيء؟" أو " أنا لا أملك تصوّرًا واضحا حول ..." مهمتك تكمن في منح موظفيك الشعور بالأمان قدر الإمكان عندما يقدمون أفكارهم واقتراحاتهم. وستعجب من مدى تأثير ذلك على ما سيتشاركه موظّفوك معك. اسأل أسئلة مُحدّدةهل ترغب في الحصول على معلومات كافية حول شركتك؟ إذن عليك أن تسأل موظفيك حول الأشياء التي ترغب بمعرفتها. لا تتوقع أن تأتي الإجابات من العدم، الإجابات لا تأتي إلا عندما تُطرح الأسئلة. ولكن الأسئلة التي ستطرحها لا ينبغي أن تكون "كيفما اتفق"، فإذا قمت بطرح أسئلة عامة وفاترة ستحصل على إجابات عامة وفاترة. فمثلاً، أسأل أي شخص "هل تسير الأمور كما يجب؟" وصدقني ستسمع حينها تسع مرات من أصل عشرة نفس الجواب وهو "الأحوال جيدة، الأمور تسير على ما يرام" بدلاً من ذلك، حاول أن تسأل "ما الشيء الوحيد الذي كان من المُمكن أن يسير على نحو أفضل لو حسّناه خلال المشروع الأخير؟" وحينها سأضمن لك أن تحصل على إجابات كثيرة وملاحظات قيمة وصادقة لأنك تسأل عن "شيء مُحدّد"، وعن حدث مُحدّد أيضًا ("المشروع الأخير"). كلما كان السؤال أكثر تحديدًا كلما حصلت على إجابات أفضل. حاول طرح أسئلة من قبيل: "ما الشّيء الوحيد الذي يُمكن تحسينه في..."، "ما الذي يجب علينا التّركيز عليه في اجتماعنا القادم" أو "ما الذي يُمكننا تحسينه في مشروعنا الحالي" حاول أيضًا أن تطرح أسئلة محددة بموعد زمني، فتوجيه الأسئلة ضمن فترة زمنية محدودة تُمثل طريقة فعالة لطرح أسئلة محددة. على سبيل المثال، بدلاً من أن تسأل "باعتقادك ما الذي يُمكننا تحسينه؟"، عليك أن تسأل " ما الشيء الوحيد الذي كان بإمكاننا تحسينه خلال الأسبوعيين الأخيرين؟" وبالتالي ستجعل الموظف يُفكر في الأسبوعين الأخيرين وبالتالي سيكون من الأسهل له التّركيز والتفكير لتقديم إجابات فعالة. تذكر دائمًا، الأسئلة العامة ستسفر عن إجابات عامة، والأسئلة المحددة تسفر عن إجابات محددة. كن قدوة ومثالاً يُحتذى به كقائد، ينظر الناس إلى أفعالك على أنها قدوة لهم. وهذا ينطبق بشكل خاص على الأمور المتعلقة بالتواصل بشكل صادق وصريح. فعندما يطرح عليك شخص ما موضوعًا حرجًا، هل تصبح حاد الطباع وتتخذ موقفًا دفاعيًا؟ أم تستمع بهدوء وتطرح الأسئلة المتعلقة بهذا لموضوع؟ ردة فعلك هذه ستكون بمثابة مقياس للبقية إذا ما كان عليهم الشعور بالارتياح عند طرح المواضيع معك في المستقبل. استخدم هذه النقطة لصالحك وكن أنت المثال الذي عليهم الاقتداء به، وستخلق النّبرة التي ترغب في سماعها في شركتك. تريد أن تصبح ردود أفعالك أمثلة لهم: "هذه هي الطريقة التي نتعامل فيها مع الأخبار السيئة... نحن نرحب بها، ونريد أن نستمع إليها". إحدى الطرق المتبعة لتحقيق ذلك، هي إظهار الامتنان للشخص الذي أبدى الرأي المخالف وشكره على ذلك، ويجب القيام بذلك بشكل علني. حاول أن تقول: "أنا أقدر وجهة نظرك." أو "ما قلته يعني لنا الكثير." من الطرق الأخرى للقيام بهذا، هو التأكيد على القواسم المشتركة مع الشخص الذي تتحدث معه. فعلى الرغم من عدم اتفاقك مع الموظف، عليك أن تذكره دومًا بأنّ مقصدكم وأهدافكم مشتركة. فأنتم جميعًا تعملون ضمن نفس الفريق. جرب أن تقول: "أعلم بأننا لا نتفق في كل شيء، ولكن بالتأكيد نحن نتفق على أنّ..." اغتنم الفرصة وأحدث تغييرًاأحدث تغييرًا. فهذا أهم ما يمكنك القيام به كي لا تكون "آخر من يعلم". ففي النهاية، هذا هو بيت القصيد من الحصول على المعلومات من موظفيك: أن تقوم بما يجب عليك القيام به عند معرفة هذه المعلومات. قد يبدو هذا أمرًا واضحًا، ولكن يجب أن تعلم أنّ إحداث تغيير -مهما كان صغيرًا يمكن أن يحدث فرقًا حقيقيًا. هل هناك تغيير يُمكن القيام به لكنه أجّلته؟ قم بتفويض شخص تثق به للقيام بهذا، وتابع عمله. هل هناك قرار ما يتعلق بتغيير يبدو عاديّا بالنسبة لك، ولكنه يُشكّل تغييرًا مُهمّا لشخص آخر؟ اطلب من هذا الشخص القيام بالأمر، وكن مستعدًا لتغيير وجهة نظرك، واسمح له بأن يكون صاحب هذا التّغيير. يمكنك أن تقول: "نظرًا لهذا الاقتراح، سوف نقوم بـ..." هذه الردود ستعطي قيمة للموظفين، حيث أنّهم يُقدّرون تفاعلك السّريع معهم، وستشعرهم بأنّ كلامهم أدى إلى تغييرات ونتائج حقيقية. هذا التشجيع سيكون له تأثير إيجابي على معنوياتهم. استكشف المزيد حول شركتكأدرك مدى صعوبة القيام بهذا الشيء، فبالرّغم من كوني الرئيس التنفيذي لشركتي، ولكنني ما زلت أكافح لوضع هذا الشيء ضمن أهم أولوياتي. يمكن لذلك أن يشعرنا بالقلق من سماع أشياء لا نرغب بسماعها، يمكن أن نشعر بأنه يشتت انتباهنا، خصوصاً عندما يتعلق الأمر بمسؤوليات إدارة الأعمال المتلاحقة. ولكن إذا أردنا لشركاتنا أن تكون بأفضل صورة، وإذا أردنا أن نخدم عملائنا بأفضل شكل ممكن وأن نخلق لموظفينا مكانًا رائعًا يعملون فيه، علينا أن نبذل جهدًا أكبر، أو نكون على استعداد لتعلّم ما لم نتعلمه حتى الآن. علينا أن نعمل على اكتشاف المزيد حول شركتنا. فلا يجب أن نكون نحن "آخر من يعلم". *إشعار لمدة أسبوعين: هي ممارسة معيارية يقوم بها الموظف في حال رغبته بالاستقالة من العمل، وذلك في حال عدم وجود ما ينص على غير ذلك في عقد العمل الخاص بالموظف، ولا يوجد أي التزامات أو واجبات على الموظف في حال طلب صاحب العمل بقاء الموظف لفترة أكثر من أسبوعين. باختصار هي إشعار صاحب العمل بترك الشركة خلال أسبوعين. ترجمة -وبتصرّف-للمقال Don’t Be The Last To Know لصاحبته Claire Lew (المُديرة التّنفيذية لشركة Know Your Company).
    1 نقطة
  5. مرحبا , يمكن ذلك من خلال الجملة الشرطية الاتية التي تظهر المحتوى فقط في الصفحة الرئيسية <b:if cond='data:blog.url == data:blog.homepageUrl'> ضع الكود هنا </b:if> فضع بدلا من "ضع الكود هنا" كود السلايد شو و سيتم الامر ان شاء الله
    1 نقطة
×
×
  • أضف...